Sum问题:leetcode 1 两数之和&leetcode15 三数之和
leetcode 1 两数之和:用哈希
题目来源:leetcode 1 两数之和
题目描述:
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
解题思路:
用哈希表保存数组的位置,判断另一个数是否在哈希表中(且不能是当前数)
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
map<int,int> m;
vector<int> ans;
for(int i=0;i<nums.size();i++)
m[nums[i]]=i;
for(int i=0;i<nums.size();i++){
auto it=m.find(target-nums[i]);
if(it!=m.end()&&it->second!=i)
{
ans.push_back(i);
ans.push_back(m[target-nums[i]]);
return ans;
}
}
return ans;
}
};
leetcode15 三数之和:用排序+双指针
题目来源: leetcode15 三数之和
题目描述:
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例:
给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]
解题思路:
先要对数组进行排序,这是后面双指针和去重的基本条件。然后固定第一个数,用双指针找后面两个数。注意相同数字要跳过,以免结果中有重复。
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> ans;
sort(nums.begin(),nums.end());
for(int i=0;i<nums.size();i++){
//双指针找结果
int l=i+1,r=nums.size()-1,target=0-nums[i];
while(l<r){
if(nums[l]+nums[r]>target) r--;
else if(nums[l]+nums[r]<target) l++;
else {
vector<int> temp(3,0);
temp[0]=nums[i];
temp[1]=nums[l];
temp[2]=nums[r];
ans.push_back(temp);
while(l<r&&nums[l]==temp[1]) l++;//去重
while(l<r&&nums[r]==temp[2]) r--;//去重
}
}
while(i+1<nums.size()&&nums[i+1]==nums[i]) i++;//去重
}
return ans;
}
};