付費限定

【專論】Binary Search 到底該不該套模板來解題?

更新於 2024/05/09閱讀時間約 7 分鐘


★ 付費 Premium 專享 ★


↑看個小廣告,支持好內容↑



二分搜尋 (Binary Search) 是優於線性搜尋的演算法,相較於一個一個找,二分法總是奉行「中央一刀切」,每次都將查找的範圍縮小一半,假設我們要在 長度=7 的陣列找數字 99,線性搜尋會很衰地連找七次才找到,但二分搜尋可以確保在三次以內就搞定。這就是O(n)O(logn)的差別:

raw-image


很顯然,二分法的大前提是只適用於排序好的資料。由於思路單純固定,有人會將二分搜尋的步驟模板化,用套版公式解題;但也有人認為應該先了解題意,不要死背解法,到底該聽哪一邊的呢?


先說結論,我認為主要的模板是可以記的,但是各題目要求的輸出、邊界狀況不同,這就要酌情滾動式調整了。

// 0.確認搜尋策略

// 1.界定搜尋範圍

// 2.當兩者範圍重疊,即離開迴圈
while(left<right){
let mid=left+Math.floor((right-left)/2);

// 3A.中間項之運算仍小於目標,左半邊都不用找了
if(運算結果<target){
left=mid+1;
// 3B.中間項之運算不小於目標,則成為新的右端點
}else{
​right=mid;
}
}

// 4.檢查邊界條件、輸出結果​


來找幾個經典題試試,在陣列中搜尋項目時,left,right 代表首項和末項:

704. Binary Search

輸出結果:index-1 (若該數字不存在)
搜尋策略:首個不小於 target 的位置
// 1.界定搜尋範圍
let left=0, right=arr.length-1;

// 2.當兩者範圍重疊,即離開迴圈
while(left<right){
let mid=left+Math.floor((right-left)/2);

// 3A.中間項之運算仍小於目標,左半邊都不用找了
if(arr[mid]<target){
left=mid+1;
// 3B.中間項之運算不小於目標,則成為新的右端點
}else{
​right=mid;
}
}

// 4.檢查該項是否等同target,若無則輸出-1​
// nums=[3,4,8,10], target=8: 輸出 2
// nums=[3,4,8,10], target=9: 輸出 -1
return nums[left]==target? left: -1;


35. Search Insert Position

輸出結果:index (表示數字出現或插入之處)
搜尋策略:首個不小於 target 的位置
// 1.界定搜尋範圍
let left=0, right=arr.length-1;

// 2.當兩者範圍重疊,即離開迴圈
while(left<right){
let mid=left+Math.floor((right-left)/2);

// 3A.中間項之運算仍小於目標,左半邊都不用找了
if(arr[mid]<target){
left=mid+1;
// 3B.中間項之運算不小於目標,則成為新的右端點
}else{
​right=mid;
}
}

// 4.如果該項仍然小於target,則插入在陣列最後
// nums=[1,3,5,6], target=6: 輸出 3
// nums=[1,3,5,6], target=7: 輸出 4
return nums[left]>=target? left: left+1;


如果是猜數字或數學問題,left,right 就會代表可行解的範圍:

278. First Bad Version

以行動支持創作者!付費即可解鎖
本篇內容共 3116 字、0 則留言,僅發佈於哩哩叩叩平安符:LeetCode 刷題筆記你目前無法檢視以下內容,可能因為尚未登入,或沒有該房間的查看權限。
avatar-img
54會員
59內容數
我要成為 LeetCode 王!快跟我一起踏上旅程!
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
LeetCode King 的其他內容
給你一堆字母請你湊出單字,Scramble 貌似也是這樣玩的 (?
成對的數字裡出現一個落單的邊緣人,我有六種方法找出它,你會幾種呢?
正確答案居然有無限多組!找到任何一種就算通過,這是怎麼回事?
陣列可以說是最常見的資料結構,LeetCode 裡的題目有過半都和 Array 有關,因此也通常是解題新手的第一站。在第一篇專文,我們就從它的操作方法講起。
千萬不要傻傻乘開啦,這題有好幾種優雅的做法~
索引很好用,但一定要做索引才能解決計數問題嗎?超車對手的機會來了!
給你一堆字母請你湊出單字,Scramble 貌似也是這樣玩的 (?
成對的數字裡出現一個落單的邊緣人,我有六種方法找出它,你會幾種呢?
正確答案居然有無限多組!找到任何一種就算通過,這是怎麼回事?
陣列可以說是最常見的資料結構,LeetCode 裡的題目有過半都和 Array 有關,因此也通常是解題新手的第一站。在第一篇專文,我們就從它的操作方法講起。
千萬不要傻傻乘開啦,這題有好幾種優雅的做法~
索引很好用,但一定要做索引才能解決計數問題嗎?超車對手的機會來了!
你可能也想看
Google News 追蹤
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
作者除了嘲笑台灣各媒體,至今無法正確解讀日本官員的國際政治語法之外,也不忘奚落和作者不同政治立場,為「戰略清晰」日本代表的前首相麻生太郎,對台灣人民的談話未被準確解讀,將之謂為「政治藝術」。
長久以來台灣人民一直想要求中國的中華民國台灣當局帶領台灣人民接軌國際。這樣的想法不只是一廂情願而是「請鬼開藥單」,是自尋死路、本末倒置的做法。如此一來一九五二年《對日和平條約》(通稱《舊金山和約》起草人美國國國務卿杜斯勒對台灣住民的主權「懸而未決」之想法,勢必將從「啓發」成為「幻想、泡影」。這一代台
台灣媒體各界抱持「己願他力」、坐享其成的心態,長期對台灣人民誇大解讀,美國對台海危機政治性的佈署動作,這些其實都是助長中國阻止「台灣人民自決意識」之目的,對中國併吞台灣之進程上有加乘效果。
作者明確的指出,美國政府出售台灣武器,等同是在一個中國之下為北京看守台灣,是在延續錯誤的「戰略模糊」政策,美國有必要《重新檢視美國的台灣安全策略》,然前提關鍵其實是在台灣人民的覺醒,對此台灣人必須要有自知之明。
Thumbnail
美智庫親中派連續對台灣讀者發表專文,包括中國學者開始參與其中令人注目,「台灣」不是「台灣共和國」,防衛台灣不是世界的責任。「台灣的真相」美國人知道、中國人知道,只有台灣人不知道。
美國深知除非台灣人民對「中華民國的法定位真相(也就是繼續維持現狀的中華民國體制,只是中國的非法政府)」,有正確的認知,並主動的付諸具體行動,發起台灣人民自決行動,如此美國總統發表政策聲明,強調中國並未擁有台灣,才能發揮正面的政治意義。
 台灣人民必須及早明確的讓國際社會了解,台灣人民確認不能以「中華民國重返聯合國」或重返國際組織,台灣人民清楚理解必需以新國家之身分,以「申請」之方式加入聯合國,如此才能以成員國資格自動成為聯合國旗下相關組織和機構之成員。
台灣人民必須先站起才能催生「代表台灣人民的台灣政府」下架「中國的中華民國台灣當局」。「台灣人民」不應該繼續將中華民國的台灣當局視同「代表台灣人民的台灣政府」,因為這是兩個法主體性截然不同的政體。台灣人民必須及早主動的站立起來,向國際社會傳達正確的聲音,付諸具體的行動是首要之急。
Thumbnail
近期的台湾,正亲身经历屋漏偏逢连夜雨的悲剧。 早自4月份起,全台便因降雨不足、政府治水失能等因素,爆发了缺水危机,诸如中部的苗栗、台中等地,皆被迫配合政府“供五停二”的民生限水措施;5月上旬开始,台湾曾引以为傲的“防疫模式”终于泡泡吹破,激增的确诊数、不明的感染源,先是迫使台湾政府承认社区感染的存
Thumbnail
曾经,中美本不是一场赛局上的对手。冷战年代,中国在两强对峙的间隙中求生,虽曾先后与美苏在朝鲜战场与珍宝岛交手,却大致维持了“兵无常势,水无常形,发展才是硬道理”的国家思维。 苏联崩解后,美国一度享受治世独霸的尊荣,并与中国维持了某种程度的“战略接近”:为免欧元集团袭夺美元独霸地位,美国开始默许产业
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
作者除了嘲笑台灣各媒體,至今無法正確解讀日本官員的國際政治語法之外,也不忘奚落和作者不同政治立場,為「戰略清晰」日本代表的前首相麻生太郎,對台灣人民的談話未被準確解讀,將之謂為「政治藝術」。
長久以來台灣人民一直想要求中國的中華民國台灣當局帶領台灣人民接軌國際。這樣的想法不只是一廂情願而是「請鬼開藥單」,是自尋死路、本末倒置的做法。如此一來一九五二年《對日和平條約》(通稱《舊金山和約》起草人美國國國務卿杜斯勒對台灣住民的主權「懸而未決」之想法,勢必將從「啓發」成為「幻想、泡影」。這一代台
台灣媒體各界抱持「己願他力」、坐享其成的心態,長期對台灣人民誇大解讀,美國對台海危機政治性的佈署動作,這些其實都是助長中國阻止「台灣人民自決意識」之目的,對中國併吞台灣之進程上有加乘效果。
作者明確的指出,美國政府出售台灣武器,等同是在一個中國之下為北京看守台灣,是在延續錯誤的「戰略模糊」政策,美國有必要《重新檢視美國的台灣安全策略》,然前提關鍵其實是在台灣人民的覺醒,對此台灣人必須要有自知之明。
Thumbnail
美智庫親中派連續對台灣讀者發表專文,包括中國學者開始參與其中令人注目,「台灣」不是「台灣共和國」,防衛台灣不是世界的責任。「台灣的真相」美國人知道、中國人知道,只有台灣人不知道。
美國深知除非台灣人民對「中華民國的法定位真相(也就是繼續維持現狀的中華民國體制,只是中國的非法政府)」,有正確的認知,並主動的付諸具體行動,發起台灣人民自決行動,如此美國總統發表政策聲明,強調中國並未擁有台灣,才能發揮正面的政治意義。
 台灣人民必須及早明確的讓國際社會了解,台灣人民確認不能以「中華民國重返聯合國」或重返國際組織,台灣人民清楚理解必需以新國家之身分,以「申請」之方式加入聯合國,如此才能以成員國資格自動成為聯合國旗下相關組織和機構之成員。
台灣人民必須先站起才能催生「代表台灣人民的台灣政府」下架「中國的中華民國台灣當局」。「台灣人民」不應該繼續將中華民國的台灣當局視同「代表台灣人民的台灣政府」,因為這是兩個法主體性截然不同的政體。台灣人民必須及早主動的站立起來,向國際社會傳達正確的聲音,付諸具體的行動是首要之急。
Thumbnail
近期的台湾,正亲身经历屋漏偏逢连夜雨的悲剧。 早自4月份起,全台便因降雨不足、政府治水失能等因素,爆发了缺水危机,诸如中部的苗栗、台中等地,皆被迫配合政府“供五停二”的民生限水措施;5月上旬开始,台湾曾引以为傲的“防疫模式”终于泡泡吹破,激增的确诊数、不明的感染源,先是迫使台湾政府承认社区感染的存
Thumbnail
曾经,中美本不是一场赛局上的对手。冷战年代,中国在两强对峙的间隙中求生,虽曾先后与美苏在朝鲜战场与珍宝岛交手,却大致维持了“兵无常势,水无常形,发展才是硬道理”的国家思维。 苏联崩解后,美国一度享受治世独霸的尊荣,并与中国维持了某种程度的“战略接近”:为免欧元集团袭夺美元独霸地位,美国开始默许产业