LeetCode 16. 最接近的三数之和

题目描述

16. 最接近的三数之和

image-20241020131300538

思路分析

解法一:排序 + 双指针(推荐)

核心思路

  • 先排序,固定一个数 i,用双指针在右侧寻找最接近的和。
  • 若当前和小于目标,左指针右移;大于目标,右指针左移。
  • 持续更新最小差值与答案。


复杂度分析

  • 时间复杂度:O(n^2),其中 n 表示数组长度。
  • 空间复杂度:O(1),排序额外空间视实现而定。
import java.util.*;

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 - 2; i++) {
            int left = i + 1;
            int right = nums.length - 1;

            while (left < right) {
                int sum = nums[i] + nums[left] + nums[right];
                if (Math.abs(sum - target) < Math.abs(ans - target)) {
                    ans = sum;
                }
                if (sum < target) {
                    left++;
                } else if (sum > target) {
                    right--;
                } else {
                    return sum;
                }
            }
        }

        return ans;
    }
}
import "sort"

func threeSumClosest(nums []int, target int) int {
	sort.Ints(nums)
	ans := nums[0] + nums[1] + nums[2]

	for i := 0; i < len(nums)-2; i++ {
		left := i + 1
		right := len(nums) - 1

		for left < right {
			sum := nums[i] + nums[left] + nums[right]
			if abs(sum-target) < abs(ans-target) {
				ans = sum
			}
			if sum < target {
				left++
			} else if sum > target {
				right--
			} else {
				return sum
			}
		}
	}

	return ans
}

func abs(x int) int {
	if x < 0 {
		return -x
	}
	return x
}

相似题目

题目 难度 考察点
15. 三数之和 中等 双指针
18. 四数之和 中等 双指针
259. 较小的三数之和 中等 双指针
11. 盛最多水的容器 中等 双指针
42. 接雨水 困难 双指针
本文作者:
本文链接: https://hgnulb.github.io/blog/2026/93653913
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!