牛牛的魔法值题解

题解

  • 解法一:图片说明 的算法,我们直接暴力把所有子维度区间的魔法值算出来。
  • 解法二:图片说明 的时间复杂度,我们考虑使用单调栈。因为计算一个子维度区间的魔法值,只需要考虑最大维度和次大维度,因此我们假设现在要选取i号点,无非就是在它左边和右边找到第一个比他大的维度值去计算答案,为什么是第一个比他大的而不是第二个或者第N个呢,因为如果选取第二大的,那么计算贡献的时候就是计算第一个比你大的和第二个比你大的。然后我们可以通过一个单调递增的栈来进行维护,从左往右扫一遍,再从右往左扫一遍即可。
class Solution {
public:
    /**
     * 返回一个数字表示魔法值。
     * @param n int整型 表示是几维空间
     * @param a int整型vector 表示n维空间的坐标
     * @return int整型
     */
    int solve(int n, vector<int>& a) {
        // write code here
        int maxn=0;
        stack<int>S;
        for (int i=n-1; i>=0; i--)
        {
            while (S.size()!=0 && S.top()<a[i])
            {
                S.pop();
            }
            if (S.size()!=0)
            {
                int tmp=S.top()^a[i];
                maxn=max(maxn,tmp);
            }
            S.push(a[i]);
        }
        while (S.size()!=0) S.pop();

        for (int i=0; i<=n-1; i++)
        {
            while (S.size()!=0 && S.top()<a[i])
            {
                S.pop();
            }
            if (S.size()!=0)
            {
                int tmp=S.top()^a[i];
                maxn=max(maxn,tmp);
            }
            S.push(a[i]);
        }
        return maxn;
       }
};
全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务