31场双周赛(前缀和,滑窗,单调栈)

1524. 和为奇数的子数组数目

class Solution {
    public int numOfSubarrays(int[] arr) {
        int n = arr.length;
        int sum = 0;
        int res = 0, odd = 0, even = 1;
        for(int i = 1; i <= n; i++) {
            sum += 
            if(arr[i-1] % 2 == 0) {
                res += odd;
            } else {
                res += even;
            }
            sum += arr[i-1];
            if(sum % 2 == 0) even++;
            else odd++;
        }
        return res % 1000000007;
    }
}

1525. 字符串的好分割数目

class Solution {
    public int numSplits(String s) {
        int n = s.length();
        int count = 0;
        int[] left = new int[256], right = new int[256];
        for(char c : s.toCharArray()) {
            if(right[c]++ == 0) count++;
        }
        int res = 0, l = 0, r = count;
        for(int i = 0; i < n - 1; i++) {
            char c = s.charAt(i);
            if(left[c]++ == 0) l++;
            if(--right[c] == 0) r--;
            if(l == r) res++;
        }
        return res;
    }
}

5459. 形成目标数组的子数组最少增加次数

class Solution {
    public int minNumberOperations(int[] target) {
        int n = target.length;
        Stack<Integer> stack = new Stack<>();
        stack.push(-1);
        int res = 0;
        for(int i = 0; i < n; i++) {
            while(!stack.empty() && stack.peek() > target[i]) {
                int top = stack.pop();
                res += top - (Math.max(target[i],stack.peek()));
            }
            if(stack.peek() == target[i]) continue;
            stack.push(target[i]);
        }
        return res + stack.pop();
    }
}
class Solution {
public:
    int minNumberOperations(vector<int>& target) {
        int n = target.size();
        int ans = target[0];
        for (int i = 1; i < n; ++i) {
            ans += max(target[i] - target[i - 1], 0);
        }
        return ans;
    }
};

猜你喜欢

转载自www.cnblogs.com/yonezu/p/13384062.html