如题
先直接暴力安排,三轮循环冲冲冲
public static int threeSumClosest(int[] nums, int target) {
int min=Integer.MAX_VALUE;
int minsum=0;
for(int i=0;i<nums.length-2;i++) { //第一重遍历
for(int x=i+1;x<nums.length-1;x++) { //第二次遍历
for(int y=x+1;y<nums.length;y++) { //第三层遍历
int sum=nums[i]+nums[x]+nums[y];
if(Math.abs(sum-target)<min) { //求得更小绝对值则替换
min=Math.abs(sum-target);
minsum=sum;
}
}
}
}
return minsum;
}
不出意外
对于多重循环匹配,很直接的做法就是双指针了
public static int threeSumClosest1(int[] nums, int target) {
Arrays.sort(nums);
int L;int R;
int minNum = Integer.MAX_VALUE;//最小差值
int res = Integer.MAX_VALUE;//最小差值时的和
for(int i = 0; i<nums.length; i++){
L = i+1; R = nums.length - 1;
while(L < R){
int temp = nums[i]+nums[L]+nums[R] - target;//差值 可为负
int temp1 = nums[i]+nums[L]+nums[R];//当前和
if(temp == 0){ //直接和为目标值
return target;
}else if(temp > 0){//和过大
R--;
}else{//和过小
L++;
}
if(Math.abs(temp) < minNum){//检索到更小的差值
res = temp1;
minNum = Math.abs(temp);
}
}
}
return res;
}