leetcode560. Subarray Sum Equals K

题目:题目链接

题意:子数组的和等于k,求子数组有多少个

思路:前缀和肯定要,因为pre[i]-pre[j]就是[j+1,i]这个子数组的和。接着枚举起点,终点,求得符合k的答案。时间复杂度是O(n^2),过不了啊一直TLE。没办法,只好给标答跪了。

它的思想是利用map维护前缀和出现的次数,然后枚举终点i,直接查找以i结尾的数组中的子数组有没有等于k的情况,因为查找是O(1)的,所以时间复杂度为O(n),就可以过了。
具体查找步骤就是对于终点i,此时map中已经保存了[0,i-1]的前缀和,那么我们只要在里面随便挑一个前缀和pre[j],如果pre[i]-pre[j]==k就表示从有一个[j+1,i]的子数组满足条件。把上述等式稍作变换:pre[j] = pre[i]-k。所以只要mp[pre[i]-k]不等于0就表示存在这样的子数组,只需要加上该数出现的次数就可以了。看代码吧:

class Solution {
public:
	int subarraySum(vector<int>& nums, int k) {
		int prefix_sum = 0;//前缀和
		int count = 0;//答案
		unordered_map<int, int>mp = { {0,1} };//记录前缀和,避免重复查找
		for (const auto& end : nums) {
			prefix_sum += end;
			count += mp[prefix_sum - k];
			mp[prefix_sum]++;
		}
		return count;
	}
};

烦球的很啊,没钱,没脑子,没动力,没勇气。。。。

希望看到这的你加油啊!!!你要加油啊!!!加油加油加油加油!!!!

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值