15. 三数之和 Java

Posted 可持续化发展

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了15. 三数之和 Java相关的知识,希望对你有一定的参考价值。

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

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

示例 1:

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

输入:nums = []
输出:[]
示例 3:

输入:nums = [0]
输出:[]

 双指针算法需要数组有序。

先想一想,暴力怎么做?

再看看,有没有单调性。

如果有单调性的话,就用双指针来做。

当 i 确定之后,双指针 j 、k 。

 

 

(i 重复了)

 如何去掉重复的三元组?

枚举 i 的时候,如果当前 nums[i]  = 上一个 nums[i] 的值,就跳过,直到 nums[i] 不等于为止。因为在上一个 nums[i] 的时候,已经找出了nums[i] 对应的所有三元组的情况。 

 

(j 重复了)

i 、j 都要判同。

破解版

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

class Solution 
    public List<List<Integer>> threeSum(int[] nums) 
        List<List<Integer>> res = new ArrayList<>();
        Arrays.sort(nums);
        for (int i = 0; i < nums.length; i++)
            //枚举 i 时,去重。当前这个 i 与前一个 i 相比
            if (i > 0 && nums[i] == nums[i - 1]) continue;
            //左右指针,j   k
            for (int j = i + 1, k = nums.length - 1; j < k; j++)
                枚举 j 时,去重。当前这个 j 与前一个 j 相比
                if (j > i +1 && nums[j] == nums[j - 1]) continue;
                /**
                 * 因为k往 左边走是单调递减的,假设右指针当前位置为 k,用 k-1 去试探一下右指针的下一个位置。
                 * 先保证 左右指针 不重叠,即 j < k-1
                 * 如果 [k-1] 这个数满足 nums[i] + nums[j] + nums[k - 1] >=0,
                 * ->说明 [k] 这个数满足 nums[i] + nums[j] + nums[k] > 0 或者 =0,则右指针需要往左边走,因为:
                 *     ->如果[k] 这个数满足 nums[i] + nums[j] + nums[k] > 0,则 [k] 不符合题意,右指针往左走,减小
                 *     ->如果[k] 这个数满足 nums[i] + nums[j] + nums[k] = 0,则 [k-1] 这个数满足 nums[i] + nums[j] + nums[k - 1] = 0,右指针继续往左走
                 *
                 *  确定好 i、j后,相当于要找出 那个
                 *  不与 j 重叠且离 j 最近的(j < k - 1) 并且满足 nums[i] + nums[j] + nums[k] = 0 的 k 的位置
                 *
                 *  j < k - 1,恒成立
                 *  -> j + 1 < k
                 *  -> j < k ,恒成立
                 */
                while (j < k - 1 && nums[i] + nums[j] + nums[k - 1] >=0) k--;
                if (nums[i] + nums[j] +nums[k] == 0)
                    res.add(Arrays.asList(new Integer[]nums[i],nums[j],nums[k]));
                
            
        
        return res;
    

纯净版

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

class Solution 
    public List<List<Integer>> threeSum(int[] nums) 
        List<List<Integer>> res = new ArrayList<>();
        Arrays.sort(nums);
        for (int i = 0; i < nums.length; i++)
            if (i > 0 && nums[i] == nums[i - 1]) continue;
            for (int j = i + 1, k = nums.length - 1; j < k; j++)
                if (j > i +1 && nums[j] == nums[j - 1]) continue;
                while (j < k - 1 && nums[i] + nums[j] + nums[k - 1] >=0) k--;
                if (nums[i] + nums[j] +nums[k] == 0)
                    res.add(Arrays.asList(new Integer[]nums[i],nums[j],nums[k]));
                
            
        
        return res;
    

以上是关于15. 三数之和 Java的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 15. 三数之和

LeetCode#15 | Three Sum 三数之和

Java算法 每日一题 编号15:三数之和

Java算法 每日一题 编号15:三数之和

15. 三数之和(Java)

15. 三数之和 Java