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; } }
积沙成塔