给你一个长度为 n
的整数数组 nums
和 一个目标值 target
。请你从 nums
中选出三个整数,使它们的和与 target
最接近。
返回这三个数的和。
假定每组输入只存在恰好一个解。
示例 1:
输入:nums = [-1,2,1,-4], target = 1 输出:2 解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。示例 2:
输入:nums = [0,0,0], target = 1 输出:0
收获:
1.从暴力枚举O(n3)优化到O(n2),固定i,然后剩下的j,k从本来的二重循环枚举O(n2)->采用双指针O(n1):
2.如何理解双指针的优化:
- j和k,同时从左边开始跑,一起跑到最右边,j和k都不能往左只能往右----->O(n)
- j和k,j作为left从最左端开始跑,一个作为right从最右端开始跑,二者一起向中间跑--->O(n)
- 也正是因为只能一个从左端开始,一个从右端开始,所以才能向下降低一级复杂度
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++;elsereturn ans;}}return ans;}
}