leetcode hot100刷题日记——6.和为 K 的子数组

在这里插入图片描述
解答:前缀和思想,见灵茶山艾府大大题解。

(1)前缀和思想:

  • 前缀和数组prefix_sum的定义是prefix_sum[i] = nums[0] + nums[1] + … + nums[i]。
  • 如果存在两个前缀和prefix_sum[j]和prefix_sum[i]满足prefix_sum[i] - prefix_sum[j] = k,则子数组nums[j+1…i]的和为k。
  • 因此,问题转化为寻找满足prefix_sum[i] - k = prefix_sum[j]的索引对(i, j)。

(2)哈希表优化:

  • 使用哈希表cnt记录前缀和出现的次数。键为前缀和的值,值为该前缀和出现的次数。
  • 初始化时,cnt[0] = 1是为了处理从数组起点开始的子数组(即prefix_sum[i] = k的情况)。

(3)迭代过程:

  • 遍历数组,逐步计算前缀和s。
  • 对于每个s,检查s - k是否存在于哈希表中。如果存在,说明存在前缀和为s - k的位置,对应子数组的和为k,将对应次数累加到结果ans。
  • 将当前前缀和s加入哈希表,供后续迭代使用。
class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
       int n=nums.size();
       int ans=0;
       //s[0]=0 单独统计
       //如果有个前缀和正好等于k,也是需要统计次数的
       unordered_map<int ,int> cnt{{0,1}};
       int s=0;//存储前缀和的变量
       for(int i=0;i<n;i++){
        s+=nums[i];//不断计算前缀和
        ans+=cnt.contains(s-k)?cnt[s-k]:0;
        cnt[s]++;
       }
        return ans;
    }
};

(4)时间与空间复杂度

  • 时间复杂度:O(n)
    遍历数组一次,每次操作哈希表的时间为均摊O(1)。
  • 空间复杂度:O(n)
    哈希表最多存储n个前缀和。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值