• 【LeetCode】四数之和


    【问题】给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。

    注意:答案中不可以包含重复的四元组。

    示例:
    
    给定数组 nums = [1, 0, -1, 0, -2, 2],和 target = 0。
    
    满足要求的四元组集合为:
    [
    [-1, 0, 0, 1],
    [-2, -1, 1, 2],
    [-2, 0, 0, 2]
    ]

    【思路】

    四数之和的大体思路是:首先固定两个数,然后将思路之和的问题变成两数之和,使用双指针的方法去寻找,由于对于两数之和,使用双指针的前提数组是一个排序数组,因此我们先对该数组进行排序,然后根据上述的思路再去遍历。

    注意在遍历时候的几种剪枝方法:

    • 如果nums[i]>target && target>0,说明后面的nums[i]肯定不存在我们想要的值,因为后面的值都大于target.

    • 固定的两个元素不能是相同元素,如果是相同的元素,那么经过两数求和算法后势必会存在重复的四元组,因此我们需要判断j > i+1 && nums[j][j-1], 如果为真,两数之和算法不会运行!

    • 两数求和怎么去重的就不解释了,遇到重复的,让指针跳过就好了!

    • 如果不想这么麻烦,可以使用DFS方法中的set去重

    • class Solution {
      public:
          vector<vector<int>> fourSum(vector<int>& nums, int target) {
              if(nums.size()<4) return {};
              sort(nums.begin(),nums.end());
              vector<vector<int>> res;
              for(int i=0;i<nums.size()-3;i++)
              {
                  if(nums[i]>target&&target>0) break;
                  if(i>0 && nums[i]==nums[i-1])
                      continue;    // 去重
                  for(int j=i+1;j<nums.size()-2;j++)
                  {
                      if(j>i+1 && nums[j]==nums[j-1])
                          continue;  // 去重
                      int l=j+1;
                      int r=nums.size()-1;
                      while(l<r)
                      {
                          if(nums[i]+nums[j]+nums[l]+nums[r]<target)
                              while(l<r && nums[l]==nums[++l]);  // 去重
                          else if(nums[i]+nums[j]+nums[l]+nums[r]>target)
                              while(l<r && nums[r]==nums[--r]);
                          else 
                          {
                              vector<int> temp{nums[i],nums[j],nums[l],nums[r]};
                              res.push_back(temp);
                              while(l<r && nums[l]==nums[++l]);
                              while(l<r && nums[r]==nums[--r]);
                          }
                      }
                  }
              }
              return res;
          }
      };
  • 相关阅读:
    凤凰网面试经历——钢管舞也算精英文化吗
    立此为证:豆瓣要做电影数字发行了(2010818)
    Officially GoldenGate was purchased by oracle in October 1, 2009
    11gR2新特性:Heavy swapping observed on system in last 5 mins.
    Oracle BMW Racing sailing vessel帆船图
    Know more about CBO Index Cost
    Samsung Epic 4G 图文介绍
    Oracle Exalogic X22 HalfRack DiagramExaloic半配图
    Java 编程下线程的生命周期
    Android 编程组件Fragments 的生命周期与 Activity 的生命周期之间的关系
  • 原文地址:https://www.cnblogs.com/zhudingtop/p/11596316.html
Copyright © 2020-2023  润新知