Leetcode 975

Leetcode 975 odd even jump

题目意思:

给定数组A,分为奇数跳和偶数跳。奇数跳只能跳到比自己大的并且是在比自己大的数字里最小的位置;偶数跳只能跳到比自己小并且是在自己小的数字里最大的位置。要求求出符合要求的起跳起始点的个数。

解法:

单调栈:

注意最枚举的点是起跳点,所以只统计odd数组。
代码来自:https://zhanghuimeng.github.io/post/leetcode-975-odd-even-jump/

class Solution {
public:
    int oddEvenJumps(vector<int>& A) {
        int n = A.size();
        int odd[n], even[n];

        stack<pair<int, int>> s;
        vector<pair<int, int>> indices;
        for (int i = 0; i < n; i++)
            indices.emplace_back(A[i], -i);
        sort(indices.begin(), indices.end());
        for (int i = 0; i < n; i++)
            indices[i].second = -indices[i].second;
        for (int i = 0; i < n; i++) {
            while (!s.empty() && indices[i].second > s.top().second) {
                s.pop();
            }
            if (s.empty())
                even[indices[i].second] = -1;
            else
                even[indices[i].second] = s.top().second;
            s.push(indices[i]);
        }

        s = stack<pair<int, int>>();
        indices.clear();
        for (int i = 0; i < n; i++)
            indices.emplace_back(A[i], i);
        sort(indices.begin(), indices.end());
        for (int i = n - 1; i >= 0; i--) {
            while (!s.empty() && indices[i].second > s.top().second)
                s.pop();
            if (s.empty())
                odd[indices[i].second] = -1;
            else
                odd[indices[i].second] = s.top().second;
            s.push(indices[i]);
        }

        int oddjump[n], evenjump[n];
        int ans = 0;
        for (int i = n - 1; i >= 0; i--) {
            if (odd[i] != -1) oddjump[i] = evenjump[odd[i]];
            else oddjump[i] = i;
            if (even[i] != -1) evenjump[i] = oddjump[even[i]];
            else evenjump[i] = i;
            if (oddjump[i] == n - 1) ans++;
        }
        return ans;
    }
};
全部评论

相关推荐

点赞 评论 收藏
分享
在评审的大师兄很完美:像这种一般就是部门不匹配 转移至其他部门然后挂掉 我就是这样被挂了
点赞 评论 收藏
分享
最近和朋友聊天,她说了句让我震惊的话:"我发现我连周末点外卖都开始'最优解'了,一定要赶在高峰期前下单,不然就觉得自己亏了。"这不就是典型的"班味入侵"吗?工作思维已经渗透到生活的方方面面。
小型域名服务器:啊?我一直都这样啊?我还以为是我爱贪小便宜呢?每次去实验室都得接一杯免费的开水回去,出门都得规划一下最短路径,在宿舍就吃南边的食堂,在实验室就吃北边的食堂,快递只有顺路的时候才取。
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务