- 无非就是想把所有可能的组合找出来,记下所有满足条件的情况
- 暴力解,双重循环,复杂度
O
(
N
2
)
O(N^2)
O(N2)这题中会导致超时
- 下面介绍一种
O
(
N
)
O(N)
O(N)时间复杂度的解
- 我无非就是要求所有可能的
[i...j] (i<=j)
组成的和 - 之前说了暴力复杂度太高,那就换另一种方法
[i...j]
组成的和可以看成[0...j-1]
的和与[0...i]
的和之差,如果分别用J,I来表示,即找到所有的J-I=target
- 这里可以巧妙地采用hashmap数据结构,
hashmap[sum]
表示这个和sum,在遍历的过程中出现的次数
- hashmap[5]=2 表示存在两种前缀和
[
0...
i
1
]
和
[
0...
i
2
[0...i_1]和[0...i_2
[0...i1]和[0...i2] 都等于5
补充
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
unordered_map<int,int> hashmap;
int sum=0, cnt=0;
hashmap[0]=1;
for(auto& x: nums){
sum+=x;
if(hashmap.count(sum-k)){
cnt+=hashmap[sum-k];
}
hashmap[sum]++;
}
return cnt;
}
};