先排序,用三个指针,时间复杂度为O(n2)
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> res = new ArrayList<>();
Arrays.sort(nums);
for(int i = 0; i< nums.length-2; i++){
if (nums[i] > 0) return res;// positive cannot be zero
if (i > 0 && nums[i] == nums[i - 1]) continue;// skip same value
for(int j = i + 1, k = nums.length - 1; j < k;){ // j for nearst value, k for biggest value
int sum = Math.negateExact(nums[i]); // this method only for int or long
if (nums[j] + nums[k] == sum) {
//adding value and moveing pointer k and j
res.add(new ArrayList<Integer>(Arrays.asList(nums[i],nums[j++], nums[k--])));
while (j < k && nums[j] == nums[j - 1]) j++;// skip same value
while (j < k && nums[k] == nums[k + 1]) k--;// skip same value
} else if ( nums[j] + nums[k] > sum) --k; // find smaller value from k
else ++j; // find bigger value from j
}
}
return res;
}
}