一位大佬曾經說過:二分查詢思路很簡單,細節是魔鬼
做了一些題後感慨真的是這樣…
二分查詢法:實質就是將乙個有序的資料集不斷地對半分割,直至找到目標值;其中兩個最關鍵的也是在面對不同題目會稍有不同的就是怎麼退出迴圈,怎麼縮小查詢空間。怎麼突破這兩點就是關鍵
在乙個有序資料集裡查詢乙個乙個目標數可以有一下兩種寫法
int
search
(vector<
int>
& nums,
int target)
return-1
;}
int
search
(vector<
int>
& nums,
int target)
return nums[left]
== target ? left :-1
;}
if
(nums[mid]
== target)
right = mid;
int
left_bound
(vector<
int>
& nums,
int target)
else
}return left;
}
來總結下怎麼推敲具體的細節
確定搜尋區間初始化時候的左右邊界,有時需要關注一下邊界值。在初始化時,有時把搜尋區間設定大一點沒有關係,但是如果恰好把邊界值排除在外,再怎麼搜尋都得不到結果
確定while裡的條件,如果right其實是size的話當left==right的時候就應該立馬退出,所以迴圈條件是while (left < right)
思考怎麼縮小比較空間就想什麼時候不是解
下面來列出幾道題根據上面的思路來練練腦
1.計算並返回 x 的平方根,其中 x 是非負整數
class
solution
}return start;}}
;
這個情況就相當於查詢右邊界
2.假設按照公升序排序的陣列在預先未知的某個點上進行了旋轉。( 例如,陣列 [0,1,2,4,5,6,7] 可能變為 [4,5,6,7,0,1,2] )。
請找出其中最小的元素。
注意陣列中可能存在重複的元素
class
solution
return nums[right];}
};
3.峰值元素是指其值大於左右相鄰值的元素。給定乙個輸入陣列 nums,其中 nums[i] ≠ nums[i+1],找到峰值元素並返回其索引。陣列可能包含多個峰值,在這種情況下,返回任何乙個峰值所在位置即可。
class
solution
return l;}}
;
4.給定乙個按照公升序排列的整數陣列 nums,和乙個目標值 target。找出給定目標值在陣列中的開始位置和結束位置。
class
solution
intleft_bound
(vector<
int>
&nums,
int target)
else
if(nums[mid]
> target)
else
if(nums[mid]
< target)}if
(i == nums.
size()
)return-1
;else
return
(nums[i]
== target)
? i :-1
;}intright_bound
(vector<
int>
&nums,
int target)
else
if(nums[mid]
> target)
else
if(nums[mid]
< target)}if
(j ==0)
return-1
;return nums[j -1]
== target ?
(j -1)
:-1;
}};
題目1 二分 二分查詢
時間限制 10000ms 單點時限 1000ms 記憶體限制 256mb 描述nettle最近在玩 艦 因此nettle收集了很多很多的船 這裡我們假設nettle氪了很多金,開了無數個船位 去除掉重複的船之後,還剩下n 1 n 1,000,000 種不同的船。每一艘船有乙個稀有值,任意兩艘船的稀有...
題目1 二分 二分查詢
link 時間限制 10000ms 單點時限 1000ms 記憶體限制 256mb 描述nettle最近在玩 艦 因此nettle收集了很多很多的船 這裡我們假設nettle氪了很多金,開了無數個船位 去除掉重複的船之後,還剩下n 1 n 1,000,000 種不同的船。每一艘船有乙個稀有值,任意兩...
Leetcode 二分題目總結
二分搜尋一般有列舉下標和列舉值兩種,mid表示下標或者某乙個值。這樣的二分搜所通常涉及兩個函式定義,乙個叫upper bound,乙個叫lower bound,這裡會產生邊界問題。從筆試 面試的角度來說,筆試中,常常涉及到二分搜尋的題目,這樣的題目,由於時間充足,允許不斷除錯,有部分分,另外需要注意...