【leetcode15】三数之和【夹逼原则】

发布于 / 算法 / 0条评论 / Tags: none / 23 次浏览

给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。

leetcode链接

示例

输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]

分析

这个题很容易想到得是暴力解法和Hash解法,但是很容易得到重复的,去重的算法甚至比原算法还费力。

所以这个题用双指针左右夹逼。得到不重复的结果

  1. 先对数组排序
  2. 用i从头遍历数组到倒数第二位。
  3. 用俩指针,j和k,j=i+1,k=len-1;
  4. 如果ijk三个位置的和大于0,那么根据已经排序的特性,k--,缩小和的大小,否则j++,提高和。
  5. 遇到和为0,可以退出当前i的寻找,i++继续

代码

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
      List<List<Integer>> list = new ArrayList<>();
        Arrays.sort(nums);
        for(int i = 0;i < nums.length-2;i++){
            if (nums[i] > 0) {
                return list;
            }

            if(i > 0 && nums[i] ==nums[i-1]){
                continue;
            }
           int j = i + 1;
           int k = nums.length-1;
           while (j<k){
               if(nums[i] + nums[j] + nums[k] > 0){
                   k --;
               }else if( nums[i] + nums[j] + nums[k] < 0){
                   j++;
               }else{
                   List<Integer> a = new ArrayList<>();
                   a.add(nums[i]);
                   a.add((nums[j]));
                   a.add(nums[k]);
                   list.add(a);
                   while (k > j && nums[k] == nums[k - 1]) k--;
                   while (k > j && nums[j] == nums[j + 1]) j++;
                   k--;
                   j++;
               }
           }
        }
        return list;
    }
}

    评论区(暂无评论)