-
题目描述:给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ,找出所有满足条件且不重复的三元组
-
题目分析:该题首先创建一个元素为List的List表,染回对给定数组进行排序,方便之后的数字移位。然后便建立一个双重循环,第一个循环是以三数之和中的第一个数为标志,然后再建立一个while循环,进行该循环的条件是第二个数的下标小于第一个数的下标。然后比较三数之和sum是否为零,若是则将三个数存储到ans中,同时第二,三个数的小标向中间移动;若不是则根据sum与0的大小确定移动哪一个数字的下标。
-
代码展示:
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> ans = new ArrayList();
int i;
int k;
int j = nums.length - 1;
int sum;//记录三数之和
if(j < 2 ||nums == null)
return ans;
Arrays.sort(nums);//排序
for(i = 0;i < nums.length - 2;i ++) {
if(nums[i] > 0) break;//若该数大于0则直接跳出循环
k = i + 1;
j = nums.length - 1;
if(i > 0 && nums[i] == nums[i - 1])
continue;//去重
while(k < j) {
sum = nums[i] + nums[k] + nums[j];
if(sum == 0) {
ans.add(Arrays.asList(nums[i],nums[k],nums[j]));
while(nums[k] == nums[k + 1]) {
k ++;
if(k == nums.length - 1)
break;
}//去重
while(nums[j] == nums[j - 1]) {
j --;
if(j == 0)
break;
}//去重
}
if(sum < 0)
k ++;
else if(sum > 0)
j --;
else {
k ++;
j --;
}
}
}
return ans;
}
}