leetcode15
Given an array nums of n integers, are there elements a, b, c in nums such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.
Note:
The solution set must not contain duplicate triplets.
Example:
Given array nums = [-1, 0, 1, 2, -1, -4], A solution set is: [ [-1, 0, 1], [-1, -1, 2] ]
Accepted
522,004
Submissions
2,197,404
解答:
/*
首先对原数组进行排序,然后开始遍历排序后的数组,这里注意不是遍历到最后一个停止,
而是到倒数第三个就可以了,中间如果遇到跟前一个数相同的数字就直接跳过。
对于遍历到的数,如果大于0则跳到下一个数,因为三个大于0的数相加不可能等于0;
否则用0减去这个数得到一个sum,我们只需要再之后找到两个数之和等于sum即可,
这样一来问题又转化为了求two sum,
这时候我们一次扫描,找到了等于sum的两数后,加上当前遍历到的数字,
按顺序存入结果中即可,然后还要注意跳过重复数字。时间复杂度为 O(n2)
*/
class Solution {
public static void main(String[] args) {
int[] nums = {-2, -3, 4, -5, 1};
List<List<Integer>> res = threeSum(nums);
}
public static List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> result = new ArrayList<>();
if(nums == null || nums.length < 3) {
return result;
}
// 对数组进行排序
Arrays.sort(nums);
// 从前向后进行遍历,
for(int i = 0; i < nums.length-2; i++) {
if(nums[i] > 0) {
break;
}
if(i > 0 && nums[i-1] == nums[i]) {
continue;
}
int sum = -nums[i];
int left = i + 1;
int right = nums.length-1;
while(left < right) {
if(nums[left] + nums[right] == sum) {
ArrayList<Integer> t = new ArrayList<>();
t.add(nums[i]);
t.add(nums[left]);
t.add(nums[right]);
result.add(t);
while(left < right && nums[left++] == nums[left]) {
}
while(left < right && nums[right--] == nums[right]) {
}
} else if(nums[left] + nums[right] < sum) {
while(left < right && nums[left++] == nums[left]) {
}
} else {
while(left < right && nums[right--] == nums[right]) {
}
}
} // end of while
}// end of for
return result;
}
}
积沙成塔

浙公网安备 33010602011771号