劍指offer11 旋轉陣列的最小數字

2021-09-23 01:43:04 字數 3036 閱讀 8174

把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。

輸入乙個公升序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。

例如陣列為的乙個旋轉,該陣列的最小值為1。

陣列可能包含重複項。

注意:陣列內所含元素非負,若陣列大小為0,請返回-1。

樣例

輸入:nums=[2,2,2,0,1]

輸出:0

思路

首先判斷陣列left位置上的數值是否小於right位置上的,若是,說明陣列是乙個遞增的陣列,則直接返回nums[left]上的數值。否則,開始進入迴圈:

判斷陣列中是否只有兩個數值,若是,則直接結束並返回right位置上的數值。

判斷right、left、mid三個位置上的元素是否都重複,若都重複則搞不清最小值是在前半段還是後半段,只能順序遍歷陣列,並直接返回最小值。如:[1,0,1,1,1]和[1,1,1,0,1]

right、left、mid上的三個值不相等時,若mid上的數值大於或者等於left,則最小值在後半段, 否則在前半段。

acwing-22 c++ code

class

solution

}return min;

}int

findmin

(vector<

int>

& nums)

int n = nums.

size()

;for

(int i =

0; i < n; i++)}

int left =0;

int right = n -1;

int mid = left;

while

(nums[right]

<= nums[left]

)

mid = left +

(right - left)/2

;if(nums[left]

== nums[right]

&& nums[mid]

== nums[left])if

(nums[mid]

>= nums[left]

)else

}return nums[mid];}

};

牛客網 c++ code

class

solution

}return res;

}int

minnumberinrotatearraycore_logn

(vector<

int>

&nums)

mid = left +

(right - left)/2

;if(nums[left]

<= nums[mid]

)else

}return nums[left]

> nums[right]

? nums[right]

: nums[left];}

intminnumberinrotatearray

(vector<

int> nums)

else

if(nums.

size()

==1)int left =0;

int right = nums.

size()

-1;int mid = left +

(right - left)/2

;if(nums[left]

== nums[mid]

&& nums[left]

== nums[right]

)else}}

;

acwing-22 python code

class

solution

:def

findmin_n

(self, nums, left, right)

: min_num = nums[left]

for i in

range

(left, right +1)

:if min_num > nums[i]

: min_num = nums[i]

return min_num

deffindmin

(self, nums)

:"""

:type nums: list[int]

:rtype: int

"""iflen

(nums)==0

:return-1

n =len(nums)

for i in

range

(n):

if nums[i]

<0:

return-1

left =

0 right = n -

1 mid = left

while nums[right]

<= nums[left]

:if right - left ==1:

mid = right

break

mid = left +

(right - left)//2

if nums[left]

== nums[right]

and nums[left]

== nums[mid]

:return self.findmin_n(nums, left, right)

if nums[mid]

>= nums[left]

: left = mid

else

: right = mid

return nums[mid]

劍指offer 11旋轉陣列中最小的數字

把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,若陣列大小為0,請返回0。第一種方法 從頭開始遍歷,當遇到不滿足非遞減排序規律的那個數時,那就是旋...

劍指Offer 11 旋轉陣列的最小數字

題目 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序陣列的乙個旋轉,輸出旋轉陣列的最小元素,例如,陣列為的乙個旋轉,該陣列的最小值為1.思路 設定兩個指標。利用二分查詢法。第乙個指標指向第乙個元素,第二個指向最後乙個元素。找到陣列的中間元素,如果中間的元素大於第乙...

《劍指Offer》11 旋轉陣列的最小數字

牛客網 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。二分查詢 一定要先判斷h,如果先判斷l則不會通過,因為陣列是從左向右幾乎遞增的。判斷中間值大於l處時,最小值可能在右邊,也可能在左邊 例如 4,1,2,4,4,4,4...