思路就是转化等式
保证Math.abs(nums[i]+num[l]+nums[r]-target)最小就行,然后i是一层遍历,l,r是双指针,所以时间复杂度为o(n2)。首先是需要排序的!
代码如下:
package com.codeking.lc;
/**
* @author xiongjl
* @since 2023/9/17 17:35
*/
public class lc16 {
public static void main(String[] args) {
//int[] nums = {1,1,-1};
//int[] nums = {-1000, -5, -5, -5, -5, -5, -5, -1, -1, -1};
int[] nums = {-1,2,1,-4};
lc16 lc16 = new lc16();
int i = lc16.threeSumClosest(nums, 1);
System.out.println(i);
}
public int threeSumClosest(int[] nums, int target) {
// 先排序
quickSort(nums, 0, nums.length - 1);
int sum, ans = nums[0] + nums[1] + nums[2];
for (int i = 0; i < nums.length - 2; i++) {
int l = i + 1, r = nums.length - 1;
sum = nums[i] + nums[l] + nums[r];
while (l < r) {
if (Math.abs(sum - target) < Math.abs(ans-target)) {
ans = sum;
}
if (sum > target) {
r--;
} else if (sum < target) {
l++;
} else {
return sum;
}
sum = nums[i] + nums[l] + nums[r];
}
}
return ans;
}
private static void quickSort(int[] nums, int l, int r) {
if (l >= r) {
return;
}
// 中心点,右边开始走,换左边开始走
int pivot = nums[l];
int left = l, right = r;
while (left < right) {
while (left < right && nums[right] >= pivot) right--;
if (left < right && nums[right] < pivot) nums[left] = nums[right];
while (left < right && nums[left] <= pivot) left++;
if (left < right && nums[left] > pivot) nums[right] = nums[left];
}
// 更新中心点
nums[left] = pivot;
// 递归
quickSort(nums, l, right - 1);
quickSort(nums, right + 1, r);
}
}