本文主要是介绍leetcode原题--最接近的三数之和,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
leetcode
- 最接近的三数之和
三数之和: https://leetcode-cn.com/problems/3sum/
最接近的三数之和: https://leetcode-cn.com/problems/3sum-closest/
最接近的三数之和
题目:给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。返回这三个数的和。
假定每组输入只存在恰好一个解。
解析:排序+双指针:先对数组进行排序,再利用三指针找出结果。(先确定一个指针,剩下的两个指针慢慢从两端往中间收紧)
这里注意一个坑:不能随随便便把变量初始化为最大值或最小值。因为Integer.MAX_VALUE + 1 = Integer.MIN_VALUE
Integer.MIN_VALUE - 1 = Integer.MAX_VALUE
Math.abs(Integer.MIN_VALUE) = Integer.MIN_VALUE
代码:
public int threeSumClosest(int[] nums, int target) {int n = nums.length;int sum = nums[0] + nums[1] + nums[2]; //切记,这里的sum不能初始Integer.Max_valueArrays.sort(nums);for(int i = 0 ; i < n-2 ; i++){if(i > 0 && nums[i] == nums[i-1]){continue;}int j = i+1;int k = n-1;while(j < k){int temp = nums[i] + nums[j] + nums[k];if(Math.abs(sum - target) > Math.abs(temp-target)){//如果前面sum初始化为Integer.MAX_VALUE,当target为-1的时候,//绝对值函数里面的值就变为Integer.MAX_VALUE+1 = Integer.MIN_VALUE ,//而Math.abs(Integer.MIN_VALUE)是等于其自身也就是Integer.MIN_VALUE的,这里涉及到原码,补码的问题。sum = temp;}if(temp > target){k--;}else if(temp < target){j++;}else{return target;}}}return sum;}```
这篇关于leetcode原题--最接近的三数之和的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!