暴力求解(超时)
执行结果:
解题思路:
语言:C++
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
int len=nums.size();
int count=0;
for(int i=0;i<len;i++){
int prefixsum=k;
for(int j=i;j<len;j++){
prefixsum-=nums[j];
if(prefixsum==0) count+=1;
}
}
return count;
}
};
前缀和+哈希表优化
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
int res = 0, sum = 0;
unordered_map<int, int> m;//<前缀和,出现次数>
m[0] = 1;//初始值,前缀和为0,代表没有元素的时候
for(const auto &num : nums){
sum += num;//前缀和
if(m.count(sum-k)) res += m[sum-k];
++m[sum];
}
return res;
}
};
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
int res = 0;
vector<int> presum(nums.size()+1, 0);
//前缀和,第一个为0,代表没有元素
for(int i = 1; i < presum.size(); ++i){
presum[i] = presum[i-1] + nums[i-1];
}
//for(auto c : presum) cout << c << " ";
unordered_map<int, int> m;//<前缀和,出现次数>
for(const auto &v : presum){
if(m.count(v-k)) res += m[v-k];
++m[v];
}
return res;
}
};
细节提升
1.时间复杂度
n的平方不可以用过,是因为我的时间复杂度取决于nums.length,那么10的四次方的平方就是10的八次方,除非10的八次方前面没有常数,不然很难通过。尽量将自己的时间复杂度控制在10的七次方。