LeetCode 16. 最接近的三数之和
题目描述
思路分析
解法一:排序 + 双指针(推荐)
核心思路:
- 先排序,固定一个数
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. 接雨水 | 困难 | 双指针 |
本博客所有文章除特别声明外,均采用
CC BY-NC-SA 4.0
许可协议,转载请注明出处!
