目录
1.Leetcode 1 两数之和
- 题目描述
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/two-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
- 思路分析
- 使用map做hashmap,使用额外的空间(n),一趟遍历进行判断。如果不在map,就加入,在map就计数。
- 因为需要返回下标,所以用sort+双指针不方便。
- 代码设计
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int>res;
int n=nums.size();
map<int,int>hashmap;
for(int i=0;i<n;++i)
{
if(hashmap.find(target-nums[i])!=hashmap.end()&&hashmap[target-nums[i]]!=i)//存在
{
res.push_back(i);
res.push_back(hashmap[target-nums[i]]);
break;
}
else
hashmap[nums[i]]=i;
}
return res;
}
};
2.Leetcode 15 三数之和
- 题目描述
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例:
给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/3sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
- 思路分析
- 第一种思路,时间复杂度为N*2,空间复杂度为N。对于三个数,我们分成两部分,固定一个数,然后使用Two Sum的思路,去判断这个数的负数是不是有Two sum的解。Two Sum的求解办法是使用一个map,进行O(n)的遍历,边遍历边放进map中。但是需要考虑到数组中有重复元素,所以结果集合里面也有重复,所以需要判断一下,如果结果集合中已经有这个解了,就不再加入。
- 第二种思路,时间复杂度为NlogN。我们采用快速排序的库函数,得到排序后的数组。我们也是像第一种思路一样,固定一个数,然后去寻找两个数之后是该数的负数。因为现在是排序数组,所以我们可以采用双指针遍历查找,为了避免重复组合,我们需要将两个指针设置到一个范围,比如都在目标数的右侧且相互不相遇。如果不加约束,那么会出现重复的组合:比如a[i]+a[j]=target;a[j]+a[i]=target。除此之外,我们还有两个策略去避