0
点赞
收藏
分享

微信扫一扫

LeetCode和为k的子数组&两数之和(哈希表的用法)

佛贝鲁先生 2022-08-17 阅读 97


题目说明

​​点此在线提交​​

LeetCode和为k的子数组&两数之和(哈希表的用法)_数组

方法一:暴力法

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

方法二:哈希表
  1. 首先哈希表中存储的是累加和结果出现的次数,其中key表示累加和结果,value表示和出现的次数。例如,mp[17] = 2表示,有两组连续的数值之和等于2
  2. 数组只需遍历一次,当此时的sum-k等于map中的某个key时,则说明此时的sum减去以前的某个sum等于k,也即这俩区间之差得到的区间的数值之和为k,count加上此时mp中对应的value
  3. 若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;
}

LeetCode和为k的子数组&两数之和(哈希表的用法)_暴力法_02

两数之和

题目描述

LeetCode和为k的子数组&两数之和(哈希表的用法)_暴力法_03

方法一:暴力法

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


举报

相关推荐

0 条评论