15. 三数之和
直觉
排序,先固定一个最左边的数,然后进行两数之和的计算。
java
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
Arrays.sort(nums);
List<List<Integer>> ans = new ArrayList<>();
int n = nums.length;
for (int i = 0; i < n - 2; i++) {
int l = i + 1, r = nums.length - 1;
int target = -nums[i];
if (i > 0 && nums[i] == nums[i - 1])
continue;
if (nums[i] + nums[l] > 0)
break;
if (nums[i] + nums[n - 2] + nums[n - 1] < 0)
continue;
while (l < r) {
int sum = nums[l] + nums[r];
if (sum > target) {
r--;
} else if (sum < target) {
l++;
} else {
List<Integer> t = new ArrayList<>();
t.add(nums[i]);
t.add(nums[l]);
t.add(nums[r]);
ans.add(t);
for (l++; l < r && nums[l] == nums[l - 1]; l++)
;
for (r--; l < r && nums[r] == nums[r + 1]; r--)
;
}
}
}
return ans;
}
}