795. Number of Subarrays with Bounded Maximum

Bad

    int numSubarrayBoundedMax(vector<int>& A, int L, int R) {
        bool valid = false;
        int  start = -1;
        int  sub_start = -1;
        int  r = 0;
        for (int i = 0; i < A.size(); i++) {
            if (A[i] <= R) {
                if (start == -1) {
                    start = i;
                }
                if (A[i] >= L) {
                    valid = true;
                    if (sub_start != -1) {
                        r -= ((i - sub_start) * (i - sub_start + 1) / 2);
                        sub_start = -1;
                    }
                } else if (sub_start == -1) {
                    sub_start = i;
                }
            } else {
                if (valid) {
                    r += ((i - start) * (i - start + 1)) / 2;
                    if (sub_start != -1) {
                        r -= ((i - sub_start) * (i - sub_start + 1) / 2);
                    }
                }
                // reset
                sub_start = -1;
                start = -1;
                valid = false;
            }
        }
        if (valid) {
            r += ((A.size() - start) * (A.size() - start + 1)) / 2;
            if (sub_start != -1) {
                r -= ((A.size() - sub_start) * (A.size() - sub_start + 1) / 2);
            }
        }
        return r;
    }
}; 
Good

class Solution {
public:
    int numSubarrayBoundedMax(vector<int>& A, int L, int R) {
        int r;
        int c = 0;
        int head = 0;
        for (int i = 0; i < A.size(); i++) {
            if (A[i] >= L && A[i] <= R) {
                c += (head + 1);
                r += c;
                head = 0;
            } else if (A[i] < L) {
                r += c;
                head++; 
            } else {
                c = 0;
                head = 0;
            }
        }
        return r;
    }
}; 

Best
class Solution {
public:
    int numSubarrayBoundedMax(vector<int>& A, int L, int R) {
        int result=0, left=-1, right=-1;
        for (int i=0; i<A.size(); i++) {
            if (A[i]>R) left=i;
            if (A[i]>=L) right=i;
            result+=right-left;
        }
        return result;
    }
};

留言

這個網誌中的熱門文章

https://leetcode.com/contest/leetcode-weekly-contest-52/problems/longest-univalue-path/

https://leetcode.com/contest/leetcode-weekly-contest-52/problems/maximum-sum-of-3-non-overlapping-subarrays/