【LeetCode】【算法】15. 三数之和
题目描述
给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
思路
思路:首先可以对数组做排序Arrays.sort(nums)
,便于寻找合适的解
- 遍历三个数即可。遍历技巧为:
I. for循环,定义i=0,遍历第一个数
II.left=i+1
作为第二个数,right=nums.length-1
作为第三个数 - while (left < right)不断循环,分为三种条件逼近结果,实际上
left
和right
就类似于双指针:
I.if ((nums[i]+nums[left]+nums[right]) > 0){right--;}
// 右侧逼近
II.else if ((nums[i]+nums[left]+nums[right]) < 0) {left++;}
// 左侧逼近
III.else 保存解
,同时在else中,对于重复数也可以用两个while循环去除,避免重复遍历添加重复结果
代码
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> list = new ArrayList<>();
// 数组排序
Arrays.sort(nums);
if (nums[0] > 0) return list;
for (int i = 0; i < nums.length; i++) {
if (i > 0 && nums[i] == nums[i-1]){
continue;
}
int left = i + 1;
int right = nums.length - 1;
while (left < right){
if ((nums[i] + nums[left] + nums[right]) > 0){
right--;
} else if ((nums[i] + nums[left] + nums[right]) < 0){
left++;
} else {
// 可以进行存储了,但是要注意去重
List<Integer> t = new ArrayList<>();
t.add(nums[i]);
t.add(nums[left]);
t.add(nums[right]);
list.add(t);
while (right > left && nums[right] == nums[right - 1]) right--;
while (right > left && nums[left] == nums[left + 1]) left++;
right--;
left++;
}
}
}
return list;
}
}
原文地址:https://blog.csdn.net/passer__jw767/article/details/143687221
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!