力扣第1題-Swift題解:兩數(shù)之和

題目描述

給定一個整數(shù)數(shù)組 nums 和一個整數(shù)目標(biāo)值 target,請你在該數(shù)組中找出 和為目標(biāo)值 target 的那 兩個 整數(shù)呀伙,并返回它們的數(shù)組下標(biāo)。

你可以假設(shè)每種輸入只會對應(yīng)一個答案。但是日丹,數(shù)組中同一個元素在答案里不能重復(fù)出現(xiàn)。

你可以按任意順序返回答案蚯嫌。

示例 1:

輸入:nums = [2,7,11,15], target = 9
輸出:[0,1]
解釋:因為 nums[0] + nums[1] == 9 哲虾,返回 [0, 1] 。
示例 2:

輸入:nums = [3,2,4], target = 6
輸出:[1,2]
示例 3:

輸入:nums = [3,3], target = 6
輸出:[0,1]

提示:

2 <= nums.length <= 104
-109 <= nums[i] <= 109
-109 <= target <= 109
只會存在一個有效答案
進(jìn)階:你可以想出一個時間復(fù)雜度小于 O(n^2) 的算法嗎择示?

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/two-sum
著作權(quán)歸領(lǐng)扣網(wǎng)絡(luò)所有束凑。商業(yè)轉(zhuǎn)載請聯(lián)系官方授權(quán),非商業(yè)轉(zhuǎn)載請注明出處栅盲。

解法 1:暴力O(n^2)解法

作為力扣第一題汪诉,簡單肯定是足夠簡單了。這道題的暴力解都不需要解釋谈秫,兩個for循環(huán)比較即可扒寄。

class Solution {
    func twoSum(_ nums: [Int], _ target: Int) -> [Int] {
        for i in 0..<nums.count-1 {
            for j in i+1..<nums.count {
                if nums[i] + nums[j] == target {
                    return [i, j]
                }
            }
        }
        return [-1, -1]
    }
}

解法 2:O(nlogn)排序+雙指針解法

基本思路如下:(證明的過程用的是非形式化描述)

  1. 首先將數(shù)組 按非降序序 排序。
  2. 定義兩個下標(biāo)拟烫,headtail旗们,分別指向數(shù)組的首個元素和最后一個元素。
  3. 如果tail下標(biāo)比head下標(biāo)大构灸,說明headtail指向了兩個不同的元素上渴,那么比較headtail對應(yīng)元素的和sum
  4. 如果sumtarget大喜颁,那么將head往前移(即加一)無濟(jì)于事稠氮,只會讓sum變得更大,所以我們將tail往后移(即減一)半开。
  5. 如果sumtarget小隔披,那么將tail往后移無濟(jì)于事,只會讓sum變得更小寂拆,所以我們將head往前移(即加一)奢米。

由于題目要求是返回數(shù)組的原下標(biāo)抓韩,而我們的數(shù)組已經(jīng)被排序過了,原來的下標(biāo)已經(jīng)被打亂鬓长,所以我這里的解法是引入一個類Item用來保存數(shù)組元素谒拴,組成新的數(shù)組,并單獨配置一個index保存數(shù)組原來的下標(biāo)涉波,這樣即使Item數(shù)組被排序英上,原來的索引依然保留。

如果我們用稍微嚴(yán)謹(jǐn)一點 循環(huán)不變式 述來論證這個方法的正確性啤覆,可以這么表達(dá)苍日。

已知 按非降序序 的數(shù)組A[0...n-1],有n>=2窗声,并且數(shù)組中存在兩個元素之和等于target相恃。

  1. 初始化: 當(dāng)i=0j=n-1時,必有A[i...j]中存在兩個元素PQ之和等于target笨觅。
  2. 循環(huán): 已知A[i...j]中存在兩個元素之和等于target豆茫,那么存在分如下三種情況:
    a. 如果A[i]+A[j] > target,由于A[j...n-1]中的任何元素都不小于A[j]屋摇,所以A[j...n-1]的任何元素和A[i]相加都必然大于target揩魂,所以可知PQ必然是存在于A[i...j-1]中。
    b. 如果A[i]+A[j] < target炮温,由于A[0...i]中的任何元素都不大于A[i]火脉,所以A[0...i]的任何元素和A[j]相加都必然小于target,所以可知PQ必然是存在于A[i+1...j]中柒啤。
    c. 如果A[i]+A[j] = target倦挂,說明我們找到了PQ
  3. 終止: 由于每一次循環(huán)担巩,如果沒找到PQ方援,都必然會導(dǎo)致A[i...j]的查找范圍縮小1。又由于PQ必然存在涛癌。所以最終PQ必然被找到犯戏。

代碼如下。

class Solution {
    class Item {
        var index = 0
        var value = 0
    }
    func twoSum(_ nums: [Int], _ target: Int) -> [Int] {
        var items = nums.map { i -> Item in
            let item = Item()
            item.value = i
            return item
        }

        for i in 0..<items.count {
            items[i].index = i
        }

        items.sort { $0.value < $1.value }

        var head = 0
        var tail = items.count - 1

        while head < tail {
            let sum = items[head].value + items[tail].value
            if sum > target {
                tail -= 1
            } else if sum < target {
                head += 1
            } else {
                return [items[head].index, items[tail].index]
            }
        }

        return []
    }
}

完整代碼也可以參見我的github拳话,點擊這里先匪,也可以直接訪問地址:https://github.com/FengHaiTongLuo/LeetCode4Swift/blob/main/1.%20Two%20Sum.swift

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市弃衍,隨后出現(xiàn)的幾起案子呀非,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件岸裙,死亡現(xiàn)場離奇詭異猖败,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)降允,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進(jìn)店門恩闻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人拟糕,你說我怎么就攤上這事判呕【胩撸” “怎么了送滞?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長辱挥。 經(jīng)常有香客問我犁嗅,道長,這世上最難降的妖魔是什么晤碘? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任褂微,我火速辦了婚禮,結(jié)果婚禮上园爷,老公的妹妹穿的比我還像新娘宠蚂。我一直安慰自己,他們只是感情好童社,可當(dāng)我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布求厕。 她就那樣靜靜地躺著,像睡著了一般扰楼。 火紅的嫁衣襯著肌膚如雪呀癣。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天弦赖,我揣著相機(jī)與錄音项栏,去河邊找鬼。 笑死蹬竖,一個胖子當(dāng)著我的面吹牛沼沈,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播币厕,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼庆冕,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了劈榨?” 一聲冷哼從身側(cè)響起访递,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎同辣,沒想到半個月后拷姿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體惭载,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年响巢,在試婚紗的時候發(fā)現(xiàn)自己被綠了描滔。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡踪古,死狀恐怖含长,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情伏穆,我是刑警寧澤拘泞,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站枕扫,受9級特大地震影響陪腌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜烟瞧,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一诗鸭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧参滴,春花似錦强岸、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至过蹂,卻和暖如春十绑,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背酷勺。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工本橙, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人脆诉。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓甚亭,卻偏偏與公主長得像,于是被迫代替她去往敵國和親击胜。 傳聞我的和親對象是個殘疾皇子亏狰,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,941評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 兩數(shù)之和給定一個整數(shù)數(shù)組 nums 和一個整數(shù)目標(biāo)值 target,請你在該數(shù)組中找出 和為目標(biāo)值 的那 兩個 整...
    莊周幻夢閱讀 440評論 0 3
  • 題目描述: 給定一個整數(shù)數(shù)組 nums 和一個目標(biāo)值 target偶摔,請你在該數(shù)組中找出和為目標(biāo)值的那兩個整數(shù)暇唾,并返...
    xu_pan閱讀 308評論 0 0
  • 第一題:兩數(shù)之和 題目描述 給定一個整數(shù)數(shù)組 nums 和一個目標(biāo)值 target,請你在該數(shù)組中找出和為目標(biāo)值的...
    浮萍一葉舟閱讀 144評論 0 0
  • # 前言 >秋招的結(jié)束,面試了大大小小的公司策州,最大的問題在于算法上瘸味。所以打算堅持在leetcode打卡,看看到底能...
    Timestamp閱讀 189評論 0 0
  • 表情是什么够挂,我認(rèn)為表情就是表現(xiàn)出來的情緒。表情可以傳達(dá)很多信息孽糖。高興了當(dāng)然就笑了枯冈,難過就哭了。兩者是相互影響密不可...
    Persistenc_6aea閱讀 125,049評論 2 7