35. Search Insert Position

Swift 3.0


//
//  E_35_SearchInsertPosition.swift
//  AlgorithmLeetCode
//
//  Created by okerivy on 2017/3/9.
//  Copyright ? 2017年 okerivy. All rights reserved.
//

import Foundation



// MARK: - 題目名稱: 35. Search Insert Position

/* MARK: - 所屬類別:
 標簽: Array, Binary Search
 
 相關(guān)題目:
  (E) First Bad Version
 
 */

/* MARK: - 題目英文:
 Given a sorted array and a target value, return the index if the target is found. If not, return the index where it would be if it were inserted in order.
 
 You may assume no duplicates in the array.
 
 Here are few examples.
 [1,3,5,6], 5 → 2
 [1,3,5,6], 2 → 1
 [1,3,5,6], 7 → 4
 [1,3,5,6], 0 → 0
 
 */


/* MARK: - 題目翻譯:
 給定排序的數(shù)組和目標值,如果找到目標玷禽,則返回索引健提。如果沒有丰捷,返回索引轰传,如果它被插入順序冰沙。
 您可以假定數(shù)組中沒有重復架诞。
 
 這里有幾個例子闪金。
 [1,3,5,6], 5 → 2
 [1,3,5,6], 2 → 1
 [1,3,5,6], 7 → 4
 [1,3,5,6], 0 → 0
 
 */



/* MARK: - 解題思路:
 
 這題要求在一個排好序的數(shù)組查找某值value,如果存在則返回對應index瞳腌,不存在則返回能插入到數(shù)組中的index(保證數(shù)組有序)绞铃。
 
 對于不存在的情況,我們只需要在數(shù)組里面找到最小的一個值大于value的index嫂侍,這個index就是我們可以插入的位置儿捧。譬如[1, 3, 5, 6],查找2挑宠,我們知道3是最小的一個大于2的數(shù)值菲盾,而3的index為1,所以我們需要在1這個位置插入2各淀。如果數(shù)組里面沒有值大于value懒鉴,則插入到數(shù)組末尾。
 
 我們采用二分法解決
 
 典型的二分查找算法碎浇。二分查找算法是在有序數(shù)組中用到的較為頻繁的一種算法临谱,
 在未接觸二分查找算法時咆畏,最通用的一種做法是,對數(shù)組進行遍歷吴裤,跟每個元素進行比較,其時間為O(n)溺健。
 但二分查找算法則更優(yōu)麦牺,可在最壞的情況下用 O(log n) 完成搜索任務。
 譬如數(shù)組 {1鞭缭,2剖膳,3,4岭辣,5吱晒,6,7沦童,8仑濒,9},查找元素6偷遗,用二分查找的算法執(zhí)行的話墩瞳,其順序為:
 
 第一步查找中間元素,即5氏豌,由于 5 < 6 喉酌,則6必然在5之后的數(shù)組元素中,那么就在{6泵喘,7泪电,8,9}中查找纪铺,
 尋找 {6, 7, 8, 9} 的中位數(shù)相速,為7,7 > 6霹陡,則6應該在7左邊的數(shù)組元素中和蚪,那么只剩下6,即找到了烹棉。
 二分查找算法就是不斷將數(shù)組進行對半分割攒霹,每次拿中間元素和 target 進行比較。

 
 */

// FIXME: 沒有完成
/* MARK: - 復雜度分析:
 
 
 */


// MARK: - 代碼:
private class Solution {
    
    func searchInsert(_ nums: [Int], _ target: Int) -> Int {
        
        var low = 0
        var high = nums.count - 1
        
        
        // 二分查找 查找第一個出現(xiàn)的元素
        // low = high = nums.count - 1  的時候 證明沒有找到
        while low < high {
            
            // 直接使用(high + low)/2 可能導致溢出
            let mid = (high - low) / 2 + low
            if nums[mid] < target {
                low = mid + 1
            } else {
                high = mid
            }
        }
        
        // 對邊界進行判斷
        
        // 走出while 循環(huán) row = high 需要的是讓 target <= nums[row] 這樣才能插入
        // 但是 對于需要插入一個大于數(shù)組中最大的數(shù) 來說 這個時候 nums[row] 依然小于 target
        // 需要插入到最后面
        if nums[low] < target {
            low += 1
        }
        
        // 如果 while low <= high { 那么上面這個if 判斷就不需要了
        
        return low
    }
    
}



// MARK: - 測試代碼:
func searchInsertPosition() {
    let nums1  = [1,2,3,5,6,6,6,8]
    
    print(Solution().searchInsert(nums1, 8)) // 7
    print(Solution().searchInsert(nums1, 2)) // 1
    print(Solution().searchInsert(nums1, 6)) // 4
    print(Solution().searchInsert(nums1, 7)) // 7
    print(Solution().searchInsert(nums1, 0)) // 0
}







最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末浆洗,一起剝皮案震驚了整個濱河市催束,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌伏社,老刑警劉巖抠刺,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件塔淤,死亡現(xiàn)場離奇詭異,居然都是意外死亡速妖,警方通過查閱死者的電腦和手機高蜂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來罕容,“玉大人备恤,你說我怎么就攤上這事〗趺耄” “怎么了露泊?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長旅择。 經(jīng)常有香客問我惭笑,道長,這世上最難降的妖魔是什么生真? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任沉噩,我火速辦了婚禮,結(jié)果婚禮上汇歹,老公的妹妹穿的比我還像新娘屁擅。我一直安慰自己,他們只是感情好产弹,可當我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布派歌。 她就那樣靜靜地躺著,像睡著了一般痰哨。 火紅的嫁衣襯著肌膚如雪胶果。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天斤斧,我揣著相機與錄音早抠,去河邊找鬼。 笑死撬讽,一個胖子當著我的面吹牛蕊连,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播游昼,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼甘苍,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了烘豌?” 一聲冷哼從身側(cè)響起载庭,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后囚聚,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體靖榕,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年顽铸,在試婚紗的時候發(fā)現(xiàn)自己被綠了茁计。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡谓松,死狀恐怖簸淀,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情毒返,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布舷手,位于F島的核電站拧簸,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏男窟。R本人自食惡果不足惜盆赤,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望歉眷。 院中可真熱鬧牺六,春花似錦、人聲如沸汗捡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扇住。三九已至春缕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間艘蹋,已是汗流浹背锄贼。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留女阀,地道東北人宅荤。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像浸策,于是被迫代替她去往敵國和親冯键。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,627評論 2 350

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