题目
给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.
与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
方案,类似0015
class Solution {
public int threeSumClosest(int[] nums, int target) {
Arrays.sort(nums);
int left = 1;
int right = nums.length - 1;
int ans = Integer.MAX_VALUE;
if (nums[0]+nums[1]+nums[2]>target){
return nums[0]+nums[1]+nums[2];
}else if (nums[right]+nums[right-1]+nums[right-2]<target){
return nums[right]+nums[right-1]+nums[right-2];
}else {
Label:
for (int i = 0; i < nums.length - 2; i++) {
left = i+1;
right = nums.length-1;
if (nums[i]+nums[i+1]+nums[i+2]>target&&Math.abs(nums[i] + nums[i+1] + nums[i+2]-target)<Math.abs(ans-target)){
ans = nums[i] + nums[i+1] + nums[i+2];
break Label;
}else {
while (right>left){
if (Math.abs(nums[right] + nums[i] + nums[left]-target)<Math.abs(ans-target)){
ans = nums[right] + nums[i] + nums[left];
}
if (nums[right] + nums[i] + nums[left] >target ) {
right--;
}else if (nums[right] + nums[i] + nums[left] <target ) {
left++;
} else if (nums[right] + nums[i] + nums[left] ==target ) {
return target;
}
}
}}
}
return ans;
}
}
复杂度计算
改进思路
- 查找这边编程二分可能会好点时间复杂度降低到O(nlogn)
基本知识杂记
关于Java中的break
- demo 如下,当j==1会直接跳出labelB下的循环,也就是跳出所有循环
public static void main(String[] args) {
lableB:
for(int i=0;i<3;i++){
lableA:
for(int j=0;j<3;j++){
System.out.println(j);
if(j==1){
break lableB;
}
}
}
System.out.println("over!");
}