刷题 | 子序列含负数 | 前缀和

原数组【。。。。】

sum数组【。。。。】(每一个值是从0到此处的和)

sum_target【。。。。】(sum数组每个数-目标)

一个map :int->int

过程:

遍历原数组:

得到sum数组,将sum数组出现过的次数都放入map,

sum数组不要了,直接减target得到sum_target

sum_target当前值去找map里面存没存过,因为现在找的就是小于等于当前位置的,所以只要排除正上方位置的就行

(我居然能写出这段。。。)

class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
        int cnt, len, sum, i;
        len = nums.size();
        sum = 0;
        vector<int> vec;
        map<int, int> mp;
        mp[0] = 1;
        cnt = 0;
        // 获取(前缀和-目标)的数列vec 
        for (i=0; i<len; i++) {
            sum += nums[i];
            vec.push_back(sum);     // 前缀和
            if (mp.find(sum) != mp.end()) {
                mp[sum]++;
            } else {
                mp[sum] = 1;
            }
            vec[i] -= k;            // 前缀和-目标
            //here
            if (mp.find(vec[i]) != mp.end()) { 
                cnt += mp[vec[i]];
                if (k == 0) {               // 
                    cnt--;
                }
            } 
        }
        return cnt;
    }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值