代码随想录算法训练营第七天 |454.四数相加II、383. 赎金信、15. 三数之和、18. 四数之和
454.四数相加II
题目链接:454. 四数相加 II
- 本质上和两数之和一样
- 通过两两组合将时间复杂度降低到O(n^2) 妙!!!
383. 赎金信
题目链接:383. 赎金信
- 仍然不要忘记暴力解法,面试可能会考!
15. 三数之和
题目链接:15. 三数之和
-
双指针法
- 这里可以将三数之和和四数之和做个归纳
-
class Solution { public: vector<vector<int>> twoSum(vector<int>& nums, int start, int target) { vector<vector<int>> res; // sort(nums.begin(), nums.end()); int lo = start; int hi = nums.size() - 1; while(lo < hi) { int sum = nums[lo] + nums[hi]; int left = nums[lo], right = nums[hi]; if(sum < target) { while(lo < hi && nums[lo] == left) { lo++; } } else if(sum > target) { while(lo < hi && nums[hi] == right) hi--; } else { res.push_back({left, right}); while(lo < hi && nums[lo] == left) lo++; while(lo < hi && nums[hi] == right) hi--; } } return res; } vector<vector<int>> threeSumTarget(vector<int>& nums, int target) { vector<vector<int>> res; int len = nums.size(); sort(nums.begin(), nums.end()); for(int i = 0; i < len; i++) { vector<vector<int>> tuples = twoSum(nums, i + 1, target - nums[i]); for(vector<int> tuple: tuples) { tuple.push_back(nums[i]); res.push_back(tuple); } while (i < len - 1 && nums[i] == nums[i + 1]) i++; } return res; } vector<vector<int>> threeSum(vector<int>& nums) { return threeSumTarget(nums, 0); } }; - 难的是去重逻辑,必须 使用num[i] == nums[i-1]的写法,否则会错过三元组组内元素之和
18. 四数之和
题目链接:18. 四数之和
- 一刷的坑!
- 千万注意不能是sum 和0比较, 是和target比较