假設按照公升序排序的陣列在預先未知的某個點上進行了旋轉。例如,陣列 [0,1,2,4,5,6,7] 可能變為 [4,5,6,7,0,1,2] 。
請找出其中最小的元素。
示例 1:
輸入:nums = [3,4,5,1,2]
輸出:1
示例 2:
輸入:nums = [4,5,6,7,0,1,2]
輸出:0
示例 3:
輸入:nums = [1]
輸出:1
本思路是概括了題目和修改後的題目,暴力破解都是這個方法。
原陣列是非遞減的,旋轉後,有兩種情況,陣列仍是非遞減的,例如將全部元素放到陣列的末尾,它相當於還是原陣列,或者有重複項,例如 ,旋轉後仍是非遞減的,那麼我們返回第乙個元素即可。另一種情況就會出現前乙個元素大於後乙個元素,那麼後乙個元素一定是最小的,也就是我們要的解。
int findmin(vector& nums)
return nums[0];
}
此思路是假設沒有重複的數。
我們知道,當陣列是已經排序好的,我們可以用二分法來查詢,其實本題也可以利用二分法來做。
我們找乙個中間值,如果這個中間值小於此時的left,那麼就意味著我們要找的數就在left 到 mid 中間,如果中間值大於left,那麼我們要找的值就在mid到right中間,直到縮減到兩個數的時候,此時左指標指向的數一定大於右指標指向的數,mid此時就會在左指標的位置上,我們返回右指標即可
class solution
while (left != mid)
else if (nums[mid] < nums[right])
mid = (left + right) / 2;
}return nums[right];
}};
把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。
輸入乙個公升序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。
例如陣列為的乙個旋轉,該陣列的最小值為1。
陣列可能包含重複項。
注意:陣列內所含元素非負,若陣列大小為0,請返回-1。
樣例
輸入:nums=[2,2,2,0,1]
輸出:0
題目位址
題目中允許出現重複的數字,這就意味著在原來的理解上我們要多一層可能,那就是中間的值等於左側值或者右側的值,舉乙個例子[2,2,2,1,1,2],此時mid指向第三個2,最小值在mid的右側;[2,2,2,1,1,2,2,2,2,2,2],此時最小值在mid左側。這樣我們就需要來判斷此時我們是要在左側尋找還是在右側尋找了。但不管怎麼樣,如果相同,我們可以省略掉相同的數的那個指標。
所以分三種情況,當中間的比最右端的小,此時我們讓右指標移動過來,當中間的比右邊打,我們讓左指標移到中間指標的後方,如果相等,就讓右指標移動。
class solution
else if (nums[pivot] > nums[high])
else
}return nums[low];
}};
詳細內容可以看這裡,講的真的很好。 旋轉陣列最小數字
把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列 為的乙個旋轉,該陣列的最小值為1。code int min int numbers,int length int low 0 int high length 1 in...
旋轉陣列最小數字
旋轉陣列最小數字 劍指offer 二分查詢 題目描述 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。解題思路 題目要求找到最小元素,第一反應是排序,但陣列基本有序直接排序浪費效能。結合資料的特點前半部分遞增,後半部分遞減,...
旋轉陣列的最小數字
1.問題描述 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出該旋轉陣列的最小元素。例如陣列 3,4,5,1,2 為 1,2,3,4,5 的乙個旋轉,該陣列的最小值為1.來自 劍指offer 2.分析 首先我們可以看到原陣列為遞增排序的,並且以...