leetcode链接:
https://leetcode.cn/problems/3sum-closest/description/
方案一
解题思路:排序 + 对撞指针;
注意点:
target
的正负问题
第一层for循环结束条件,一定要加上 i < nums.length - 2
防止程序编译报错
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| int result = nums[0] + nums[1] + nums[2] - target; int left,right,flag;
Arrays.sort(nums);
for (int i = 0; nums[i] < Math.abs(target) && i < nums.length - 2; i++) { left = i + 1; right = nums.length -1; while (left < right) {
flag = nums[i] + nums[left] + nums[right] - target;
if (flag > 0) { right--; if (flag < Math.abs(result)) { result = flag; } } else if (flag == 0) { return target; } else { left++; if (flag < Math.abs(result)) { result = flag; } } } }
return result + target;
|
几乎最优方案
https://leetcode.cn/problems/3sum-closest/solution/hua-jie-suan-fa-16-zui-jie-jin-de-san-shu-zhi-he-b/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| class Solution { public int threeSumClosest(int[] nums, int target) { Arrays.sort(nums); int ans = nums[0] + nums[1] + nums[2]; for(int i=0;i<nums.length;i++) { int start = i+1, end = nums.length - 1; while(start < end) { int sum = nums[start] + nums[end] + nums[i]; if(Math.abs(target - sum) < Math.abs(target - ans)) ans = sum; if(sum > target) end--; else if(sum < target) start++; else return ans; } } return ans; } }
作者:guanpengchn 链接:https: 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
|