# 每日一题(10):最接近的三数之和

image-20210203222840142

# 开始

今天的题和上次的三数之和

基本上策略可以说一模一样了

都是先排序

再用双指针思路

这里就不做赘述啦

不同之处是可以去掉一些判重逻辑和跳过步骤

下面看下代码实现吧

class Solution {
    public int threeSumClosest(int[] nums, int target) {
        // 对数组排序,减少处理复杂度
        Arrays.sort(nums);

        int minAbsDiff = Integer.MAX_VALUE;
        int minAbsDiffSum = 0;
        for (int i = 0; i < nums.length; i++) {
            int curr = nums[i];
            int l = i + 1;
            int r = nums.length - 1;
            if (l == r) {
                // 当左指针右指针指向同一位置,退出循环
                break;
            }
            if (i > 0 && nums[i] == nums[i - 1]) {
                // 当前一数与当前数相等,则跳过重复值
                continue;
            }
            while (l < r) {
                int left = nums[l];
                int right = nums[r];
                int sum = curr + left + right;
                int diff = sum - target;
                if (diff == 0) {
                    return sum;
                } else if (diff < 0) {
                    // 当diff<0,说明sum比target小,需要右移左指针,加大sum
                    l++;
                } else {
                    // 当diff>0,说明sum比target大,需要左移右指针,减小sum
                    r--;
                }
                int absDiff = Math.abs(diff);
                if (absDiff < minAbsDiff) {
                    minAbsDiff = absDiff;
                    minAbsDiffSum = sum;
                }
            }
        }

        return minAbsDiffSum;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44

执行效率也是相当nice了

image-20210203223249792

最近有些忙,但是我还是会坚持继续走下去

咱们写代码的

练习心法还是非常有必要的

不然真成了码农了,对吧

其实说了这么多

是为了凑原创字数...

可爱的粉丝们

那我们

下期再见~

最近更新: 7/5/2021, 2:10:34 PM