- 最接近的三数之和
最接近的三数之和
1.回溯算法
package LeetCode;
import java.util.*;
class Solution {
int res = 0;
int chazhi = Integer.MAX_VALUE;
ArrayList<Integer> list = new ArrayList<>(); //临时的容器
public int threeSumClosest(int[] nums, int target) {
helper(nums,target,0);
return res;
}
private void helper(int[] nums, int target, int start){
if (list.size()==3){
int sum=0;
Iterator<Integer>iterator=list.iterator();
while (iterator.hasNext()){
sum+=iterator.next();
}
int tmpChazhi=Math.abs(sum-target);
if (tmpChazhi<chazhi){
chazhi=tmpChazhi;
res=sum;
}
return;
}
for (int i = start; i < nums.length ; i++) {
list.add(nums[i]);
helper(nums,target,i+1);
list.remove(list.size()-1);
}
}
}
2.双指针算法
package LeetCode;
import java.lang.reflect.Array;
import java.util.Arrays;
class Solution {
public static void main(String[] args) {
Solution s = new Solution();
int[]nums={-1,2,1,-4};
int target=2;
int result=s.threeSumClosest(nums,2);
System.out.println(result);
}
public int threeSumClosest(int[] nums, int target) {
Arrays.sort(nums);
int res=0;
int diff=Integer.MAX_VALUE;
for (int i = 0; i < nums.length; i++) { //{a,b,c,d,e} c 为num.length-3的位置
// 0 0+1
int start=i+1;
int end=nums.length-1;
while (start<end){
int sum=nums[i]+nums[start]+nums[end];
if (sum<target){
start++;
}else if(sum==target){
return target;
}else {
end--;
}
int tempDiff=Math.abs(sum-target);
if(tempDiff<diff){
diff=tempDiff;
res=sum;
}
}
}
return res;
}
}