代码随想录算法训练营第七天 |454.四数相加II、383. 赎金信、15. 三数之和、18. 四数之和

37 阅读1分钟

代码随想录算法训练营第七天 |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. 四数之和

  • 一刷的坑!image-20221123104850081.png
  • 千万注意不能是sum 和0比较, 是和target比较