• 图解 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个包过面试锦囊,拿走不谢!

    点“在看”你懂得 

  • 相关阅读:
    如何更改Linux yum源?
    Vsftp设置为PASV mode(被动模式传送)
    CentOS 6.5 yum安装配置lnmp服务器(Nginx+PHP+MySQL)
    centos6.3搭建FTP服务器图文教程
    Linux关闭/开启防火墙命令
    linux下火狐浏览器安装flash player插件
    判断网站织梦DedeCms版本的方法
    PHP获取当前url路径的函数及服务器变量
    leetcode 205 Isomorphic Strings
    leetcode 70 Climbing Stairs
  • 原文地址:https://www.cnblogs.com/csnd/p/16674911.html
Copyright © 2020-2023  润新知