题目描述:
给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.
与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
思路:和三数求和差不多,我们使用一个数组来记录从下标为i开始三数和最接近target的值,最后遍历这个数组找出最小的即可。
代码实现:
class Solution {public int threeSumClosest(int[] nums, int target) {//排序 Arrays.sort(nums);//来存储下标从i开始的最接近的值int[] temp = new int[nums.length];int i=0;//遍历开始for(;i<nums.length-2;i++) {if(i>0&&nums[i]>target) break;int lo = i+1;int hi = nums.length-1;//记录与目标值相差最小的值Integer tt =null;boolean v = false;//在i+1~length-1中找与目标值相差最小的值while(lo<hi) {int tet = nums[hi]+nums[lo]+nums[i];if(tt==null) tt = tet;else {tt = Math.abs(tet - target)<Math.abs(tt-target)?tet:tt;}if(tet>target) {hi--;while(nums[hi]==nums[hi+1]) {if(hi<=lo) break;hi--;}}else if(tet<target) {lo++;while(nums[lo]==nums[lo-1]) {if(lo>=hi) break;lo++;}}else {v = true;break;}}if(v) return target;//把与目标值相差最小的值存入数组else temp[i] = tt;}//遍历数组查找最小值int min = temp[0];for(int j=1;j<i;j++) {if(Math.abs(temp[j]-target)<Math.abs(min-target))min = temp[j];}System.out.println(min);return min;}
}