<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
【力扣題號】704.二分查詢 力扣題目連結
範例 1:
輸入: nums = [-1,0,3,5,9,12], target = 9
輸出: 4
解釋: 9 出現在 nums 中並且下標為 4
範例 2:
輸入: nums = [-1,0,3,5,9,12], target = 2
輸出: -1
解釋: 2 不存在 nums 中因此返回 -1
提示:
注意讀題,陣列為有序陣列,且陣列中無重複元素,因為一旦有重複元素,使用二分查詢法返回的元素下標可能不是唯一的。
在二分查詢的過程中,保持不變數,就是在 while 尋找中每一次邊界的處理都要堅持根據區間的定義來操作,這就是迴圈不變數規則。
寫二分法,區間的定義一般為兩種,左閉右閉即 [left, right],或者左閉右開即 [left, right)。
第一種寫法,我們定義 target 是在一個在左閉右閉的區間裡,也就是[left, right] 。因為定義 target 在 [left, right] 區間,所以有如下兩點:
while (left <= right) 要使用 <= ,因為left == right是有意義的,所以使用 <=
if (nums[middle] > target) ,right 要賦值為 middle - 1,因為當前這個 nums[middle] 一定不是 target ,那麼接下來要查詢的左區間結束下標位置就是 middle - 1
// 版本一 class Solution { public: int search(vector<int>& nums, int target) { int left = 0; int right = nums.size() - 1; // 定義target在左閉右閉的區間裡,[left, right] while (left <= right) { // 當left==right,區間[left, right]依然有效,所以用 <= int middle = left + ((right - left) / 2);// 防止溢位 等同於(left + right)/2 if (nums[middle] > target) { right = middle - 1; // target 在左區間,所以[left, middle - 1] } else if (nums[middle] < target) { left = middle + 1; // target 在右區間,所以[middle + 1, right] } else { // nums[middle] == target return middle; // 陣列中找到目標值,直接返回下標 } } // 未找到目標值 return -1; } };
如果說定義 target 是在一個在左閉右開的區間裡,也就是[left, right) ,那麼二分法的邊界處理方式則截然不同。
有如下兩點:
while (left < right),這裡使用 < ,因為 left == right 在區間 [left, right) 是沒有意義的
if (nums[middle] > target) ,right 更新為 middle,因為當前 nums[middle] 不等於 target,去左區間繼續尋找,而尋找區間是左閉右開區間,所以 right 更新為 middle,即:下一個查詢區間不會去比較 nums[middle]
// 版本二 class Solution { public: int search(vector<int>& nums, int target) { int left = 0; int right = nums.size(); // 定義target在左閉右開的區間裡,即:[left, right) while (left < right) { // 因為left == right的時候,在[left, right)是無效的空間,所以使用 < int middle = left + ((right - left) >> 1); if (nums[middle] > target) { right = middle; // target 在左區間,在[left, middle)中 } else if (nums[middle] < target) { left = middle + 1; // target 在右區間,在[middle + 1, right)中 } else { // nums[middle] == target return middle; // 陣列中找到目標值,直接返回下標 } } // 未找到目標值 return -1; } };
通過以上兩種方法,要注意它們不同的地方:
① right 的初始值不一樣
② 左右區間的更新值的差別
參考:《程式碼隨想錄》
到此這篇關於C語言詳細講解二分查詢用法的文章就介紹到這了,更多相關C語言 二分查詢內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45