leetcode16. 最接近的三數之和--每天刷一道leetcode算法系列!

2021-01-12 程式設計師面試

作者:reed,一個熱愛技術的斜槓青年,程式設計師面試聯合創始人


題目描述

給定一個包括 n 個整數的數組 nums 和 一個目標值 target。找出 nums 中的三個整數,使得它們的和與 target 最接近。返回這三個數的和。假定每組輸入只存在唯一答案。

例如,給定數組 nums = [-1,2,1,-4], 和 target = 1.
與 target 最接近的三個數的和為 2. (-1 + 2 + 1 = 2).

分析

本題最容易想到的方法應該就是暴力破解,但是靠暴力破解的話時間複雜度會到 O(n^3),面試中顯然不能讓面試官滿意。
採取如下方式可以將時間複雜度優化為 O(n^2)。
首先對數組進行排序,排序的時間複雜度 O(nlogn)。
在數組 nums 中,進行遍歷,每遍歷一個值取其下標i,形成一個固定值 nums[i]
再使用左指針 left = i + 1 ,右指針 right = nums.length - 1 。
根據 sum = nums[i] + nums[left] + nums[right] 的結果,
並判斷 sum 與 target 的大小關係,因為數組有序,如果 sum == target 則說明距離為 0 直接返回結果,如果 sum < target 則 left++,如果 sum > target 則 right--,並不斷更新返回值。
整個遍歷過程時間複雜度為 O(n^2)
因此總時間複雜度:O(n^2)。

代碼

public int threeSumClosest(int[] nums, int target) {
        assert nums.length > 2;
        Arrays.sort(nums);
        int left;
        int right;
        int sum3;  //數組中的三個數的和
        int res = 0;  //記錄返回結果
        int tmp = Integer.MAX_VALUE; //記錄sum3和target的差的絕對值
        for (int i = 0; i < nums.length - 2; i++) {
            left = i + 1;
            right = nums.length - 1;
            while (left < right) {
                sum3 = nums[left] + nums[right] + nums[i];
                //如果已經找到等於target的三個數,直接返回即可。
                if (sum3 == target) {
                    return target;
                }
                if (Math.abs(sum3 - target) < tmp) {
                    tmp = Math.abs(sum3 - target);
                    res = sum3;
                }
                if (sum3 > target) {
                    right--;
                } else {
                    left++;
                }
            }

        }

        return res;
    }


長按訂閱更多面經分享

相關焦點

  • LeetCode-16.最接近的三數之和(3Sum Closest)
    16. 最接近的三數之和給定一個包括 n 個整數的數組 nums 和 一個目標值 target。
  • leetcode刷對了麼
    今天,逆行君就帶你從世界觀和方法論兩方面走進「leetcode」 簡單來說,leetcode是一個美國的在線編程網站,它收集了各大公司的經典算法面試題,用戶可以選擇不同的語言進行代碼的在線編寫、編譯和調試。
  • 每天一道leetcode56-合併區間
    正當班主任要繼續發話,只聽到角落默默想起來一個聲音:」K2」前言 2018.11.13號打卡明天的題目:https://leetcode-cn.com/problems/minimum-path-sum/descrip題目 每天一道leetcode56
  • 每天一道leetcode234-回文鍊表
    正當班主任要繼續發話,只聽到角落默默想起來一個聲音:」K2」前言 2018.11.6號打卡明天的題目:https://leetcode-cn.com/problems/remove-linked-list-elements/以後明天的題目提取公布一下哈,因為有些朋友想提前做一下~題目 leetcode234-回文鍊表中文連結:https
  • LeetCode面試系列 第6天:No.9 - 迴文數
    今天我們來分析一道相對輕鬆的字符串面試題吧,恰好大家從Python 100天中學到的字符串知識可以派上用場。Leetcode今天要給大家分析的面試題是 LeetCode 上第 9 號問題,LeetCode - 9.
  • LeetCode刷題第三周【數組(簡單)】
    在楊輝三角中,每個數是它左上方和右上方的數的和。初始化斐波那契數列的時候,我們初始化了前2個數為0和1,然後從第三個數開始計算。在這裡我們需要在初始化的時候讓第一二兩行值都為1,從第三行開始計算。最大子序和(難度:簡單)Nov.03 題目要求:給定一個整數數組 nums ,找到一個具有最大和的連續子數組(子數組最少包含一個元素),返回其最大和。示例 1:輸入: [-2,1,-3,4,-1,2,1,-5,4]輸出: 6解釋: 連續子數組 [4,-1,2,1] 的和最大,為 6。
  • [LeetCode] 912. Sort an Array 數組排序
    [1,2,3,5]Example 2:Input: [5,1,1,2,0,0]Output: [0,0,1,1,2,5]Note:1<=A.length<=10000-50000<=A[i]<=50000這道題讓我們給數組排序,在平時刷其他題的時候
  • ​LeetCode刷題實戰137:只出現一次的數字 II
    算法的重要性,我就不多說了吧,想去大廠,就必須要經過基礎知識和業務邏輯面試+算法面試。
  • 怒刷leetcode...
    心態放平,好好刷leetcode,好offer總在不遠處。   計算機視覺畢業後找不到工作怎麼辦?   AI專業畢業後是不是找不到工作?近日,有知乎網友提問,獲得了70萬閱讀量。   還是要把自己的基本功搞紮實,真正的人才什麼時候都緊缺   知友們普遍認為,好不好找工作和你選擇學Java還是CV無關,算法沒有高下之分,企業只看個人水平。不要沉浸在985、或是學CV比Java高級的幻想中,自己基礎咋樣自己還沒點兒數?   知友@hzwer說:   當我們說 AI 人才缺口的時候,是說能獨當一面的人太少。
  • ​LeetCode刷題實戰15題: 三數之和
    所以,為了提高大家的算法能力,這個公眾號後續每天帶大家做一道算法題,題目就從LeetCode上面選 !今天和大家聊的問題叫做三數之和 ,我們先來看題面:https://leetcode.com/problems/3sum/描述給定一個整數的數組,要求尋找當中所有的a,b,c三個數的組合,使得三個數的和為0.注意,
  • Go 刷 leetcode|一道簡單難度卻讓我陷入沉思的題目
    題目描述 給定一個整數數組 nums ,找到一個具有最大和的連續子數組(子數組最少包含一個元素),返回其最大和。示例:輸入: [-2,1,-3,4,-1,2,1,-5,4],輸出: 6解釋: 連續子數組 [4,-1,2,1] 的和最大,為 6。進階:如果你已經實現複雜度為 O(n) 的解法,嘗試使用更為精妙的分治法求解。
  • ​LeetCode刷題實戰53:最大子序和
    所以,為了提高大家的算法能力,這個公眾號後續每天帶大家做一道算法題,題目就從LeetCode上面選 !今天和大家聊的問題叫做 最大子序和,我們先來看題面:https://leetcode-cn.com/problems/maximum-subarray/Given an integer array nums, find the contiguous subarray (containing at least one number
  • [LeetCode] 923. 3Sum With Multiplicity 三數之和的多種情況
    然後使用兩個指針j和k分別初始化為 i+1 和 n-1,若 A[j]+A[k] 小於 sum,則將j自增1;若 A[j]+A[k] 大於 sum,則將k自減1;若 A[j]+A[k] 正好等於 sum,則此時需要統計重複數字的個數,假設跟 A[j] 相同的數字有 left 個,跟 A[k] 相同的數字有 right 個。
  • 數據結構與算法:05 Leetcode同步練習(一)
    題目01:兩數之和https://leetcode-cn.com/problems/two-sum/給定一個整數數組 nums 和一個目標值 target,請你在該數組中找出和為目標值的那 兩個整數,並返回他們的數組下標。
  • [LeetCode] 996. Number of Squareful Arrays 平方數組的個數
    LeetCode 有好幾道關於全排列的題,比較基本的就是這兩道 Permutations 和 Permutations II,很明顯這道題中的數字是有可能重複的,所以跟後者更接近。其實這道題的解法就是基於 Permutations II 來做的,只不過在過程中加入了判斷平方數組的步驟。
  • 每天一道算法題(第三十二期)
    var majorityElement = function (nums) {  return nums.sort(((a, b) => a - b))[(nums.length / 2) | 0]};最小的k個數輸入整數數組 arr ,找出其中最小的 k 個數。
  • leetcode雞蛋掉落問題(egg drop)
    搜索後發現是leetcode上的一道經典面試題~因為過於經典,已經被踢出google面試題庫了(。)那我們就直接看看leetcode上的題目叭!leetcode現在有中文站,看起來更方便了:https://leetcode-cn.com/problems/super-egg-drop/solution/--你將獲得 K 個雞蛋,並可以使用一棟從 1 到 N  共有 N 層樓的建築。每個蛋的功能都是一樣的,如果一個蛋碎了,你就不能再把它掉下去。
  • Leetcode刷題No.234
    今天的題目就是一道套路題。https://leetcode-cn.com/problems/palindrome-linked-list我們有兩種方式來判斷是否一樣,第一種是有兩個指針分別指向首和尾,然後比較是否相同,如果相同就向中間走一步,否則就是不同;第二種是從中間截斷,並將其中一半進行翻轉,然後對這兩個新的鍊表進行對比。因為這是單鍊表,所以只能採用第二種方式。其次要考慮奇數個節點和偶數個節點的情況,我的解決方法是在紙上將兩種可能性都畫出來,然後再寫代碼,這樣會一口氣寫對。下面我可以給示例代碼。
  • 面試向算法 - 二分法專題(二)
    因此,我期望將這些知識給帶出來,就引申出了本系列文章和視頻。在 《二分法(一)》當中我們已經分別講解了:那麼,本篇的主要內容即是對剩下的四種應用進行深入分析。最大/最小平均值(max/min average)注意:搭配 B 站視頻更香奧!
  • 每天一道LeetCode算法題——兩數之和
    前言這是博主在LeetCode上刷的第一道題。說來慚愧,算法書看了不止一本,但是看書的時候書裡的練習都沒有怎麼思考,直接看的參考答案,導致了對算法的研究僅僅停留在了解這種程度,缺乏實戰所以在平時coding中也不會將算法知識代入使用。