【数组】最接近的三数之和

一、题目

力扣原题:https://leetcode-cn.com/problems/3sum-closest/

二、暴力

class Solution {
    public int threeSumClosest(int[] nums, int target) {
        int result = -1;
        int delta = Integer.MAX_VALUE;
        for (int i = 0; i < nums.length; i++) {
            for (int j = i + 1; j < nums.length; j++) {
                for (int k = j + 1; k < nums.length; k++) {
                    int sum = nums[i] + nums[j] + nums[k];
                    int newDelta = Math.abs(sum - target);

                    // 差值判断
                    if (newDelta < delta) {
                        delta = newDelta;
                        result = sum;
                    }
                }
            }
        }
        return result;
    }
}
  • 时间复杂度:O(n^3)。遍历所有三数相加的可能性,找到三数之和最接近目标值的三数之和;
  • 空间复杂度:O(1)。

三、排序 + 双指针

class Solution {
    public int threeSumClosest(int[] nums, int target) {
        // 数组递增排序
        Arrays.sort(nums);

        int result = -1;
        int delta = Integer.MAX_VALUE;
        for (int i = 0; i < nums.length; i++) {
            // 首、尾指针往中间收缩
            int left = i + 1;
            int right = nums.length - 1;
            while (left < right) {
                int sum = nums[i] + nums[left] + nums[right];
                int newDelta = Math.abs(sum - target);
                if (newDelta < delta) {
                    delta = newDelta;
                    result = sum;
                }

                if (sum > target) {
                    right--;
                } else if (sum < target) {
                    left++;
                } else {
                    return sum;
                }
            }
        }
        return result;
    }
}
  • 时间复杂度:O(n^2)。数组排序的复杂度为O(nlog(n)),随后数组遍历 + 双指针的时间复杂度为O(n^2);
  • 空间复杂度:O(1)。

四、总结

  • 数组问题很多情况下可以通过有序化寻找新的解决思路,降低时间复杂度;
  • 在有序数组中,寻找两数之和与目标数的关系经常可以采用双指针法;

你可能感兴趣的:(算法,最接近的三数之和,双指针)