旋轉陣列的最小數字

2022-07-06 15:36:09 字數 1596 閱讀 3011

假設按照公升序排序的陣列在預先未知的某個點上進行了旋轉。例如,陣列 [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.分析 首先我們可以看到原陣列為遞增排序的,並且以...