把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。
輸入乙個公升序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。
例如陣列為的乙個旋轉,該陣列的最小值為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...