旋轉陣列的最小數字

2021-07-24 08:29:08 字數 1794 閱讀 7935

題目描述

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

輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。

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

note:給出的所有元素都大於0,若陣列大小為0,請返回0。

最直觀的解法就是,從頭到尾遍歷一次,我們就能找到最小的元素。這種思路的時間複雜度為o(n)。但是這個思路沒有利用旋轉陣列的特性,肯定達不到面試官的要求。

旋轉陣列的特點:

(1)遞增排序的陣列旋轉之後的陣列可劃分為兩個排序的子陣列;

(2)前面的子陣列的元素都大於或等於後面子陣列的元素;

(3)最小的元素剛好是兩個子陣列的分界線;

(4)旋轉陣列在一定程度上是有序的;

在有序的陣列中可以使用二分查詢來實現o(logn),我們也可用二分查詢的思想尋找旋轉陣列的最小數字。

以  為例,我們先把第乙個指標指向第乙個元素3,把第二個指標指向最後乙個元素2,如圖所示。

位於兩個指標中間的數字是5,它大於第乙個指標指向的數字。因此中間數字5一定位於第乙個遞增字陣列中,並且最小的數字一定位於它的後面。因此我們可以移動第乙個指標讓它指向陣列的中間位置,如圖所示。

此時位於這兩個指標中間的數字為1,它小於第二個指標指向的數字。因此這個中間數字為1一定位於第二個遞增子陣列中,並且最小的數字一定位於它的前面或者它自己就是最小的數字。因此我們可以移動第二個指標指向兩個指標中間的元素即下標為3的元素。

此時兩個指標的距離為1,表明第乙個指標已經指向了第乙個遞增子陣列的末尾,而第二個指標指向第二個遞增子陣列的開頭。第二個子陣列的第乙個數字就是最小的數字,因此第二個指標指向的數字就是我們查詢的結果。

如果中間位置的數既等於p1位置數,又等於p2位置的數,這時候,不能確定移哪個指標,就必須採用順序查詢的方法來尋找最小數;

**如下:

public class solution  

int leftindex = 0;  

int rightindex = array.length -1;  

int midindex = leftindex;  

while(array[leftindex] >= array[rightindex])  

midindex = (leftindex + rightindex) / 2;  

if(array[leftindex] == array[midindex] && array[rightindex] == array[midindex])  

if(array[midindex] >= array[leftindex])else if(array[midindex] < array[rightindex])  

}  return array[midindex];  

}public int mininorder(int arr, int leftindex, int rightindex)  

}  return min;  

}  public static void main(string args) ;

system.out.println(test.minnumberinrotatearray(arr));}}

旋轉陣列最小數字

把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列 為的乙個旋轉,該陣列的最小值為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.分析 首先我們可以看到原陣列為遞增排序的,並且以...