1 问题
在刷LeetCode题目时,有用到最小值比较,所以我就定义了一个int
类型的最大值,即Integer.MAX_VALUE
,然后后续的程序运行,发现程序出错,不是语法问题,最后发现就是int
类型数据越界。
2 题目
给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
示例:
输入:nums = [-1,2,1,-4], target = 1
输出:2
解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。
提示:
3 <= nums.length <= 10^3
-10^3 <= nums[i] <= 10^3
-10^4 <= target <= 10^4
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/3sum-closest
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
3 思路
可以使用暴力解法进行求解,但是时间复杂度很高,容易超出时间限制,这里的思路是比较常见的思路:排序+双指针。
先对数组进行升序排序,然后根据左右指针向中间进行查找:
- 当
sum>target
时,表示当前和太大,应该将右指针向左移动,因为左边的元素小于右边的元素 - 当
sum<target
时,说明当前和太小,应该将左指针向右移动 - 当
sum==target
,直接返回即可
4 java代码
import java.util.Arrays;
public class threeSumClosest {
public int threeSumClosest(int[] nums, int target) {
/**
* 思路:先对数组进行升序排序,然后使用双指针进行查找
*/
Arrays.sort(nums);
int n = nums.length;
// int min = 10000000;
int min = Integer.MAX_VALUE;//int类型越界
for (int i = 0; i < n; ++i) {
//防止重复计算
if (i > 0 && nums[i] == nums[i - 1])
continue;
int l = i + 1, r = n - 1;
while (l < r) {
int sum = nums[l] + nums[r] + nums[i];
if (sum == target)//如果等于target 直接返回即可
return target;
//如果当前的和最靠近target 那么替换之前的和
if (Math.abs(sum - target) < Math.abs(min - target))
min = sum;
if (sum > target) {//和太大,应该将右指针左移动
--r;//方法一
//方法二
// int r0 = r - 1;
// while (l < r0 && nums[r0] == nums[r])
// --r0;
// r = r0;
} else //和偏小,应该左指针 向右移动
{
++l;//方法一
//方法二
// int l0 = l + 1;
// while (l0 < r && nums[l0] == nums[l])
// ++l0;
// l = l0;
}
}
}
return min;
}
public static void main(String[] args) {
int[] nums = {-3,-2,-5,3,-4};
System.out.println(new threeSumClosest().threeSumClosest(nums, -1));
}
}