15.三数之和
分析
- 用三指针。先固定一个最前面的,后面再用双指针,一个指向当前固定元素的下一元素,另一个指向最后一个元素,往中间遍历
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
if(nums.length < 3) return new ArrayList<>();
List<List<Integer>> res = new ArrayList<>();
Arrays.sort(nums);
int len = nums.length;
for(int i = 0; i < len - 2; i++) {
if(i > 0 && nums[i] == nums[i - 1]) continue;
if(nums[i] + nums[i + 1] + nums[i + 2] > 0) break;
if(nums[i] + nums[len - 2] + nums[len - 1] < 0) continue;
int j = i + 1;
int k = len - 1;
while(j < k) {
int temp = nums[i] + nums[j] + nums[k];
if(temp == 0) {
res.add(Arrays.asList(nums[i], nums[j], nums[k]));
j++;
while(j < k && nums[j] == nums[j - 1]) j++;
k--;
while(j < k && nums[k] == nums[k + 1]) k--;
}
else if(temp > 0) k--;
else j++;
}
}
return res;
}
}
16.最接近的三数之和
分析
class Solution {
public int threeSumClosest(int[] nums, int target) {
if(nums.length < 3) return -1;
Arrays.sort(nums);
int max = 1001;
int len = nums.length;
for(int i = 0; i < len - 2; i++) {
if(i > 0 && nums[i] == nums[i - 1]) continue;
int min1 = nums[i] + nums[i + 1] + nums[i + 2];
if(min1 > target) {
if(Math.abs(target - min1) < Math.abs(target - max)) {
max = min1;
break;
}
}
int max1 = nums[i] + nums[len - 2] + nums[len - 1];
if(max1 < target) {
if(Math.abs(target - max1) < Math.abs(target - max)) {
max = max1;
continue;
}
}
int j = i + 1;
int k = len - 1;
while(j < k) {
int temp = nums[i] + nums[j] + nums[k];
if(temp == target) return target;
if(Math.abs(target - temp) < Math.abs(target - max)) max = temp;
if(temp < target) {
j++;
while(j < k && nums[j] == nums[j - 1]) j++;
}
else {
k--;
while(j < k && nums[k] == nums[k + 1]) k--; /去重
}
}
}
return max;
}
}