总结:
两数之和——哈希表:时间复杂度O(n),暴力解法O(n^2)
三数之和——双指针:一层i的for循环,双指针left和right。时间复杂度O(n^2),暴力解法O(n^3)
四数之后——双指针:两层i和k的for循环,双指针left和right,时间复杂度O(n^3),暴力解法O(n^4)
再增加也是一样的,三个、四个甚至更多数之和都是这个方法,代码也是差不多,思路都一样的,有几个小地方需要注意:(1)给的数组一定要进行排序;(2)每个下标的数字都要进行去重,循环里头的去重和双指针的left和right去重,去重基本都是当前位和前一位去比较,不能当前位和下一位比较,别的倒也是没啥了,细心一点就能写对。
四数相加II那道题不太一样,要求不一样,这个更为简单一些。
class Solution { public: vector<int> twoSum(vector<int>& nums,int target) { unordered_map <int,1)">int> map;//不需要有序,所以用这个 for(int i = 0; i < nums.size(); i++) { auto iter = map.find(target - nums[i]);find函数返回的是迭代器 if(iter != map.end()) {这句话表示找到了target-nums[i]这个元素 return {iter->second,i};返回找到的元素的下标,还有i这个下标 } map.insert(nums[i],i);如果没找到,不存在里头的话就添加进行 } return {}; } }; 这道题还有变体,要是说给你一个数组,让你在里头找所有两个数之和等于target的元组,那就跟三数之和四数之后一样了,双指针法解决,注意去重。