优美子数组

思路

先计算前缀中pre奇数个数。
利用map存储,pre[i]的个数,
查找时是由pre[i]-k

int numberOfSubarrays(vector<int>& nums, int k) {
        int sz = nums.size();
        if (0 == sz) return 0;
        std::vector<int> pre;
        pre.resize(sz, 0);
        if (nums[0] % 2 != 0) pre[0] = 1;
        for(int i = 1; i < sz; ++i) {
            if (nums[i] % 2 != 0) {
                pre[i] = pre[i - 1] + 1;
            } else {
                pre[i] = pre[i - 1];
            }
        }

        std::unordered_map<int, int> map;
        map[0] = 1;
        int count = 0;
        for (int i = 0; i < sz; i++) {
            auto iter = map.find(pre[i] - k);
            if (iter != map.end()) {
                count += iter->second;
            }
            iter = map.find(pre[i]);
            if (iter != map.end()) {
                map[pre[i]] += 1;
            }else{
                map[pre[i]] = 1;
            }
        }
        return count;
    }
posted @ 2021-07-13 10:21  cyssmile  阅读(61)  评论(0)    收藏  举报