LeetCode题解-16-3Sum Closest

解题思路

题目要求找到数组中a+b+c最接近target的和。思路和15题是类似的,也是排序采用二层遍历,计算出目标值c,用二分查找,如果找到就可以直接返回,如果没有找到,那就是找到插入的位置,计算该位置左右两边数字(假如存在)得到的和,看看是否存在更接近的和。

对于Java来说,Arrays.binarySearch对于没有匹配的情况,就可以支持返回应该插入的位置(用一个特定的负数表示)。

参考源码

public class Solution {
    public int threeSumClosest(int[] num, int target) {
        Arrays.sort(num);
        int min = Integer.MAX_VALUE;
        int t = target;
        for (int i = 0; i < num.length - 2; i++) {
            if (i > 0 && num[i] == num[i - 1]) {
                continue;
            }

            int a = num[i];
            for (int j = i + 1; j < num.length - 1; j++) {
                if (j > i + 1 && num[j] == num[j - 1]) {
                    continue;
                }

                int b = num[j];
                int c = target - (a + b);
                int idx = Arrays.binarySearch(num, j + 1, num.length, c);
                if (idx >= 0) {
                    return target;
                }

                int pos = -(idx + 1);
                if (pos > j + 1) {
                    int tmpTarget = a + b + num[pos - 1];
                    int tmp = Math.abs(tmpTarget - target);
                    if (tmp < min) {
                        min = tmp;
                        t = tmpTarget;
                    }
                }
                if (pos < num.length) {
                    int tmpTarget = a + b + num[pos];
                    int tmp = Math.abs(tmpTarget - target);
                    if (tmp < min) {
                        min = tmp;
                        t = tmpTarget;
                    }
                }
            }
        }

        return t;
    }
}

猜你喜欢

转载自blog.csdn.net/mccxj/article/details/62237133
今日推荐