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;
	}
};

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

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

你可能感兴趣的:(LeetCodeTop100,leetcode,算法)