16-最接近的三数之和

import java.util.Arrays;

/**
最接近的三数之和:16
2026-10-07 12:52:12
//给定一个长度为 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
//解释:与 target 最接近的和是 0(0 + 0 + 0 = 0)。 
//
// 
//
// 提示: 
//
// 
// 3 <= nums.length <= 1000 
// -1000 <= nums[i] <= 1000 
// -10⁴ <= target <= 10⁴ 
// 
//
// Related Topics 数组 双指针 排序 👍 1826 👎 0

**/

//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    /**
     * 思路:先排序,先确定外层循环, 然后内层循环用双指针。 双指针通过排序后, 大于target, 则right--, 小于target,则left++
     *
     * 答成功:
     *  执行耗时:16 ms,击败了66.04% 的Java用户
     *  内存消耗:44.7 MB,击败了68.74% 的Java用户
     *  
     *  时间复杂度度 O(N^2)
     *  空间复杂度 O(1)
     * @param nums
     * @param target
     * @return
     */
    public int threeSumClosest(int[] nums, int target) {
        if(nums  == null || nums.length == 0 || nums.length < 3) {
            return 0;
        }
        Arrays.sort(nums);
        int min = nums[0] + nums[1] + nums[2];
        for(int i=0; i < nums.length; i ++) {
            int left = i + 1;
            int right = nums.length - 1;
            while (left < right && left < nums.length && right > i) {
               int sum = nums[i] + nums[left] + nums[right];
               if(Math.abs(sum - target) < Math.abs(min - target)) {
                   min = sum;
               }
               if(sum > target) {
                   right --;
               } else if(sum < target)  {
                   left ++;
               } else  {
                   return target;
               }

            }
        }
        return min;

    }
}
//leetcode submit region end(Prohibit modification and deletion)


©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容