設陣列最後乙個元素為 x ,在最小元素右側的元素,它們的值一定都小於等於 x ;在最小元素左側的元素,它們的值一定都大於等於 x 。
在二分查詢每一步中,設左邊界為 low
lowlo
w,右邊界為 hig
hhigh
high
,區間中點為 piv
otpivot
pivo
t。將中軸元素 num
bers
[piv
ot]numbers[pivot]
number
s[pi
vot]
與右邊界元素 num
bers
[hig
h]numbers[high]
number
s[hi
gh] 進行比較:
當n um
bers
[pivot]
mber
s[hi
gh]numbers[pivot] < numbers[high]
number
s[pi
vot]
mber
s[hi
gh]時,說明中軸元素在最小元素右側,可以忽略查詢區間的右半部分。
當n um
bers
[piv
ot]>nu
mber
s[hi
gh]numbers[pivot] > numbers[high]
number
s[pi
vot]
>nu
mber
s[hi
gh]時,說明中軸元素在最小元素左側,可以忽略查詢區間的左半部分。
當n um
bers
[piv
ot]=
numb
ers[
high
]numbers[pivot] = numbers[high]
number
s[pi
vot]
=num
bers
[hig
h]時,無法判斷中軸元素和最小元素的位置關係,但可以確保無論右邊界元素是不是最小元素,都存在替代品,即中軸元素,所以可以忽略右邊界元素,即,將區間右端向左縮小一位繼續查詢。
class
solution
else
if(numbers[pivot]
> numbers[high]
)else
}return numbers[low];}
}notes:關於二分時用的是low
+(hi
gh−l
ow)/
2low + (high - low)/2
low+(h
igh−
low)
/2而非( lo
w+hi
gh)/
2(low + high)/2
(low+h
igh)
/2,是為了避免兩數相加時發生溢位。
JZ 11 旋轉陣列的最小數字
題目 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如,陣列 3,4,5,1,2 為 1,2,3,4,5 的乙個旋轉,該陣列的最小值為1。示例 1 輸入 3,4,5,1,2 輸出 1 示例 2 輸入 2,2,2,0,1 ...
11 旋轉陣列的最小數字
把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。我的 二分法 class min defsolution self,nums a nums 0 b nums 1 iflen num...
11 旋轉陣列的最小數字
二分法搜尋方法 include using namespace std intmin int numbers,int length int index1 0 int index2 length 1 int indexmid index1 while numbers index1 numbers in...