版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_37293461/article/details/84111631
给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.
与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
这个题为了减少时间复杂度,最优雅的解法是双指针遍历,求最接近target的三数之和,最后返回。
上代码:
import java.util.Arrays;
/**
* @author zhangyan
* @date 2018/10/8 8:16
*/
public class ThreeSumClosest {
public static int threeSumClosest(int[] num, int target) {
int result = num[0] + num[1] + num[num.length - 1]; //初始三数之和result
Arrays.sort(num); //数组排序
for (int i = 0; i < num.length - 2; i++) {
int start = i + 1, end = num.length - 1; //头指针,尾指针
while (start < end) {
int sum = num[i] + num[start] + num[end]; //此时的三数之和为sum
if (sum > target) {
end--; //尾指针后移
} else {
start++; //头指针前移
}
if (Math.abs(sum - target) < Math.abs(result - target)) //取绝对值,比较大小
{
result = sum; //找到最接近target的三数之和
}
}
}
return result; //返回最接近的三数之和
}
public static void main(String[] args) {
int[] num = new int[]{-1,2,1,-4};
System.out.println(threeSumClosest(num,1));
}
}