春招打卡d4n07-leetcode刷题16最接近的三数之和

173 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

leetcode刷题16最接近的三数之和

前文

本文为leetcode遍历相关题目,题目需要为16,主要考察遍历时对于效率的优化。

题目信息

给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。

返回这三个数的和。

假定每组输入只存在恰好一个解。

解题思路

根据题目信息,我们需要对一个数组中找到加和最接近目标数据的三个数。直接的遍历显然效率低下,因此本解法采用双指针实现效率优化。首先对于给定的目标数组进行排序操作,这样可以方便后续的双指针处理。而我们采取的思路是由于有三个元素,第一个元素进行遍历即可。指定两个指针标记为,分别为p和q。p、q初始时分别位于循环的下一位以及队列末尾。循环时对于数据和与目标数据进行比较,如果达到目标数据,则直接返回结果。反之,与当前存储的数据比较,保留距离更小的一个。当三者和小于目标值时,移动p指针,而大于目标值则移动q指针。以此方式循环即可最终得到距离最近的三数之和。

解题代码

public int threeSumClosest(int[] nums, int target) {
    nums = Arrays.stream(nums).sorted().toArray();
    int result = Integer.MAX_VALUE;
    if(nums.length <= 3){
        int temp = 0;
        for (int i = 0; i < nums.length; i++) {
            temp += nums[i];
        }
        return temp;
    }
    int temp = Integer.MAX_VALUE;
    for (int i = 0; i < nums.length - 2; i++) {
        int p = i + 1;
        int q = nums.length - 1;
        if(result == Integer.MAX_VALUE){
            result = nums[0] + nums[p] + nums[q];
        }
        if(nums[i] == temp){
            continue;
        }
        while (true){
            if(p >= q){
                break;
            }
            if(nums[i] + nums[p] + nums[q] == target){
                result = target;
                break;
            }else if(nums[i] + nums[p] + nums[q]< target){
                result = Math.abs(result - target) < Math.abs(nums[i] + nums[p] + nums[q] - target) ? result : nums[i] + nums[p] + nums[q];
                p++;
            }else{
                result = Math.abs(result - target) < Math.abs(nums[i] + nums[p] + nums[q] - target) ? result : nums[i] + nums[p] + nums[q];
                q--;
            }
        }
        temp = nums[i];
    }
    return result;
}

后记

  • 千古兴亡多少事?悠悠。不尽长江滚滚流。