1、分析二分查詢**時,不要出現 else,全部展開成 else if 方便理解。
2、注意「搜尋區間」和 while 的終止條件,如果存在漏掉的元素,記得在最後檢查。
3、如需定義左閉右開的「搜尋區間」搜尋左右邊界,只要在 nums[mid] == target 時做修改即可,搜尋右側時需要減一。
4、如果將「搜尋區間」全都統一成兩端都閉,好記,只要稍改 nums[mid] == target 條件處的**和返回的邏輯即可
5. 推薦使用mid = left + (right - left)/2 代替 mid = (left + right) / 2 ,就可以防止數字過大越界的情況。
第乙個,最基本的二分查詢演算法:
因為我們初始化 right = nums.length -
1所以決定了我們的「搜尋區間」是 [left, right]
所以決定了 while
(left <= right)
同時也決定了 left = mid+
1 和 right = mid-
1因為我們只需找到乙個 target 的索引即可
所以當 nums[mid]
== target 時可以立即返回
第二個,尋找左側邊界的二分查詢:
對於尋找左右邊界的二分搜尋,常見的手法是使用左閉右開的「搜尋區間」
因為我們初始化 right = nums.length
所以決定了我們的「搜尋區間」是 [left, right)
所以決定了 while
(left < right)
同時也決定了 left = mid +
1 和 right = mid
因為我們需找到 target 的最左側索引
所以當 nums[mid]
== target 時不要立即返回
而要收緊右側邊界以鎖定左側邊界
第三個,尋找右側邊界的二分查詢
因為我們初始化 right = nums.length
所以決定了我們的「搜尋區間」是 [left, right)
所以決定了 while
(left < right)
同時也決定了 left = mid +
1 和 right = mid
因為我們需找到 target 的最右側索引
所以當 nums[mid]
== target 時不要立即返回
而要收緊左側邊界以鎖定右側邊界
又因為收緊左側邊界時必須 left = mid +
1所以最後無論返回 left 還是 right,必須減一
right等於什麼,決定於求的是什麼,
如果是求左右界,通常是取length
rigth = length 對應著 while(left < right)
right = length -1 對應著 while(left <= right)
mid等於什麼,取決於左側和右側邊界是否為開區間,開區間那一邊就無需-1
如果是[left,right),left = mid - 1 & rigth = mid
大道至簡!二分查詢的細節也不過如此! c語言判斷一鍋端
給大家分享一些c語言的對錯題,可以 固本培元 加深鞏固基礎概念的記憶。1資料是操作的物件,操作的結果會改變資料的狀況。對 2字元型變數用來存放字元常量,注意只能放2個字元。錯 3c語言中可以把乙個字串賦給乙個字元變數。錯 4在 c語言中的實型變數分為兩種型別,它們是 float 實型 和double...
面試演算法 排列組合子集一鍋端
方 看題五分鐘,不會做,看解析 先看中文站,再看國際站 選擇最優解析 回頭再來寫 面試四步走 和面試官,題目限制條件 說說可能解,選擇最優解 碼字 跑測試用例 思維要點 不要人肉進行遞迴 找到最近最簡方法,將其拆解成可重複解決的問題 重複子問題 數學歸納法思維 題目 給定一組不含重複元素的整數陣列 ...
AI獨角獸曠視回應裁員15 ,杭州分部一鍋端訊息
近日,有爆料稱,ai獨角獸曠視裁員15 杭州分部一鍋端,上午還在改bug,下午通知讓走人。n 1賠償正常給,所有檔案事先列印好,沒有協商餘地,簽字同時所有許可權關閉,並且每個人都被看著弄電腦,不允許拷貝檔案,動作整齊劃一流程短平快。對此,曠視科技回應稱,該訊息不實,如有都是正常年度業務調整。資料顯示...