资讯动态

Kimi LeetCode 16. 最接近的三数之和 Java实现

发布时间:2026/8/29 5:14:39 来源:尧图企业网站定制
以下是 LeetCode 第 16 题「最接近的三数之和」的 Java 实现采用 排序 双指针 的经典解法解题思路1. 排序先对数组排序便于使用双指针2. 固定一个数遍历数组固定 nums[i] 作为第一个数3. 双指针查找在 i 右侧使用双指针 left 和 right 寻找另外两个数使三数之和最接近 target4. 移动策略- 若 sum targetleft需要更大的和- 若 sum targetright--需要更小的和- 若 sum target直接返回不可能更接近了5. 更新答案每次计算差值绝对值保留最接近的和Java 代码javaimport java.util.Arrays;class Solution {public int threeSumClosest(int[] nums, int target) {// 先排序便于双指针操作Arrays.sort(nums);int n nums.length;// 初始化答案为前三个数之和int closestSum nums[0] nums[1] nums[2];// 固定第一个数 nums[i]for (int i 0; i n - 2; i) {// 可选跳过重复元素减少不必要的计算if (i 0 nums[i] nums[i - 1]) {continue;}int left i 1; // 左指针int right n - 1; // 右指针while (left right) {int sum nums[i] nums[left] nums[right];// 如果恰好等于 target直接返回不可能更接近了if (sum target) {return sum;}// 更新最接近的和比较当前差值与历史最小差值if (Math.abs(sum - target) Math.abs(closestSum - target)) {closestSum sum;}// 根据和与 target 的大小关系移动指针if (sum target) {left; // 和太小左指针右移以增大和} else {right--; // 和太大右指针左移以减小和}}}return closestSum;}}复杂度分析指标 复杂度 说明时间复杂度 O(n²) 排序 O(n log n) 双指针遍历 O(n²)空间复杂度 O(1) 只使用了常数额外空间排序是原地排序示例验证- 输入nums [-1, 2, 1, -4], target 1- 排序后[-4, -1, 1, 2]- 过程- i0, nums[i]-4: left1(-1), right3(2) → sum-3, 差值4- i1, nums[i]-1: left2(1), right3(2) → sum2, 差值1更新答案- 输出2优化版本带剪枝javaclass Solution {public int threeSumClosest(int[] nums, int target) {Arrays.sort(nums);int n nums.length;int closestSum nums[0] nums[1] nums[2];// 边界剪枝如果最小三数之和已 target后面的只会更大if (closestSum target) return closestSum;// 边界剪枝如果最大三数之和已 target后面的只会更小int maxSum nums[n-1] nums[n-2] nums[n-3];if (maxSum target) return maxSum;for (int i 0; i n - 2; i) {int left i 1, right n - 1;while (left right) {int sum nums[i] nums[left] nums[right];if (sum target) return sum;if (Math.abs(sum - target) Math.abs(closestSum - target)) {closestSum sum;}if (sum target) {left;} else {right--;}}}return closestSum;}}带剪枝的版本在某些测试用例下可以减少运行时间但时间复杂度仍为 O(n²)。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价