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的主要内容,如果未能解决你的问题,请参考以下文章