/**
* First sort the array, (i)
* scan through the array, set every -nums[i] as a target, (ii)
* for the rest elements i+1<=i<=n do a two-pointer two sum. (iii)
* Step 3 can avoid duplicates.
* Time complexity O(n).
*/
public class Solution {
public List<List<Integer>> threeSum(int[] nums) {
Arrays.sort(nums);
int target = 0, low = 0, high = 0;
List<List<Integer>> res = new ArrayList<>();
for (int i=0; i<nums.length-2; i++) {
// skip the case which nums[i] == nums[i-1] (*)
if (i == 0 || (i > 0 && nums[i] != nums[i-1])) {
target = -nums[i];
// search the rest of the sorted array to find a sum equals to the target
// using two-pointer
low = i + 1; high = nums.length-1;
while (low < high) {
if (nums[low]+nums[high] == target) {
res.add(new ArrayList<>(Arrays.asList(-target, nums[low], nums[high])));
while (low < high && nums[low] == nums[low+1]) low++;
while (low < high && nums[high] == nums[high-1]) high--;
low++; high--;
}
else if (nums[low]+nums[high] > target) high--;
else low++;
}
}
}
return res;
}
}
Leetcode 15. 3Sum
最新推荐文章于 2018-12-11 19:36:09 发布