题目说明
方法一:暴力法
int subarraySum(vector<int>& nums, int k) {
int count = 0;
for(int start = 0; start < nums.size(); start++){
int sum = 0;
for(int end = start; end < nums.size(); end++){
sum += nums[end];
if(sum == k) count++;
}
}
return count;
}
方法二:哈希表
- 首先哈希表中存储的是累加和结果出现的次数,其中key表示累加和结果,value表示和出现的次数。例如,mp[17] = 2 表示,有两组连续的数值之和等于2
- 数组只需遍历一次,当此时的sum-k等于map中的某个key时,则说明此时的sum减去以前的某个sum等于k,也即这俩区间之差得到的区间的数值之和为k,count加上此时mp中对应的value
- 若mp中某个键对应的值为2,且对应的两个区间为[0,2],[0,5],则说明必定有
区间[3,5]内的和为0
int subarraySum(vector<int>& nums, int k) {
map<int, int> mp;
mp[0] = 1;//防止nums[0]==k的情况
int count = 0;
int sum = 0;
for(int num : nums){
sum += num;
if(mp.find(sum - k) != mp.end()){
count += mp[sum - k];
}
mp[sum]++;
}
return count;
}
两数之和
题目描述
方法一:暴力法
vector<int> twoSum(vector<int>& nums, int target) {
int len=nums.size();
vector<int> res;
for(int i=0;i<len-1;i++)
for(int j=i+1;j<len;j++)
{
if(nums[i]+nums[j]==target){
res.push_back(i);
res.push_back(j);
break;
}
}
return res;
}
方法二:哈希表
一次哈希
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> res;
map<int, int> mp;
for(int i=0; i<nums.size(); i++){
if(mp.find(target - nums[i]) != mp.end()){
res.push_back(mp[target - nums[i]]);
res.push_back(i);
break;
}
mp[nums[i]] = i;
}
return res;
}
两次哈希
vector<int> twoSum(vector<int>& nums, int target) {
map<int,int> mp;
vector<int> res;
for(int i=0;i<nums.size();i++)
mp[nums[i]]=i;
for(int i=0;i<nums.size();i++){
//此题应该是默认没有重复元素
if(mp.find(target-nums[i])!=m.end() && mp[target-nums[i]]!=i){
res.push_back(i);
res.push_back(mp[target-nums[i]]);
break;
}
}
return res;
}