• 图解 LeetCode 第 16 号问题:最接近的三数之和


    点击关注上方“五分钟学算法”,

    设为“置顶或星标”,第一时间送达干货。

    转自编程如画,作者灵魂画师牧码

    今天分享的题目来源于 LeetCode 第 16 号问题:最接近的三数之和。

    题目链接

    https://leetcode-cn.com/problems/3sum-closest/

    题目描述

    给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。

    例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.
    
    
    与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
    

    解题方案

    思路

    • 标签:排序和双指针

    • 本题目因为要计算三个数,如果靠暴力枚举的话时间复杂度会到O(n^3),需要降低时间复杂度

    • 首先进行数组排序,时间复杂度O(nlogn)

    • 在数组nums中,进行遍历,每遍历一个值利用其下标i,形成一个固定值nums[i]

    • 再使用前指针指向start = i + 1处,后指针指向end = nums.length - 1处,也就是结尾处

    • 根据 sum = nums[i] + nums[start] + nums[end] 的结果,判断sum与目标target的距离,如果更近则更新结果ans

    • 同时判断sum与target的大小关系,因为数组有序,如果sum > targetend--,如果sum < targetstart++,如果sum == target 则说明距离为0直接返回结果

    • 整个遍历过程,固定值为n次,双指针为n次,时间复杂度为O(n^2)

    • 总时间复杂度:O(nlogn) + O(n^2) = O(n^2)

    图片理解


    参考代码

    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;i++) {
                int start = i+1, end = nums.length - 1;
                while(start < end) {
                    int sum = nums[start] + nums[end] + nums[i];
                    if(Math.abs(target - sum) < Math.abs(target - ans))
                        ans = sum;
                    if(sum > target)
                        end--;
                    else if(sum < target)
                        start++;
                    else
                        return ans;
                }
            }
            return ans;
        }
    }

    END


    ● 我这些年从来没有用过算法,除了出去面试的时候

    ● 如何用一行代码实现网页变灰效果?

    ● 摸鱼神器,千万别让老板看见!

    66个包过面试锦囊,拿走不谢!

    点“在看”你懂得 

  • 相关阅读:
    kafka与Rocketmq的区别【转】
    k8s故障解决干货文档链接
    利用local nginx搭建k8s-1.17.4高可用kubernetes集群
    生产gitlab还原步骤
    jenkins备份和还原
    ASP.NET Core3.1使用IdentityServer4中间件系列随笔(二):创建API项目,配置IdentityServer保护API资源
    使用Feign出现404错误问题
    高并发系统限流-漏桶算法和令牌桶算法
    框架-springmvc源码分析(二)
    框架-springmvc源码分析(一)
  • 原文地址:https://www.cnblogs.com/csnd/p/16674911.html
Copyright © 2020-2023  润新知