劍指Offer 陣列 (2)

2021-09-02 01:33:25 字數 1520 閱讀 1631

知識點:查詢 資料結構:陣列

題目:把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。 輸入乙個非減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。 例如陣列為的乙個旋轉,該陣列的最小值為1。 note:給出的所有元素都大於0,若陣列大小為0,請返回0。

思路《劍指offer》:這道題最直觀的解法並不難,從頭到尾遍歷一次陣列,就可以找出最小的元素,這種思路的時間複雜度是o『(n)。但是這種思路沒有利用輸入的旋轉陣列的特性,達不到面試官的要求。

我們注意到旋轉之後的陣列實際上可以劃分為兩個排序的子陣列,而且前面子陣列的元素都大於或者等於後面子陣列的元素;我們注意到最小的元素剛好是這兩個子陣列的分界線。 再排序的陣列中我們可以利用二分查詢的方法o(logn)的查詢。本題給出的陣列一定程度上是排序的,因此我們可以利用二分查詢的思路來尋找這個最小的元素。

和二分查詢一樣,我們用兩個指標分別指向陣列的第乙個元素和最後乙個元素。

接著我們可以找到中間元素,如果該中間元素位於前面的遞增子陣列,那麼它應該大於或者等於第乙個指標指向的元素,此時最小的元素應該是位於中間元素的後面;我們可以把第乙個元素指向中間元素,這樣就可以縮小尋找範圍;如果中間元素小於或者等於第二個指標指向的元素。此時該陣列中的最小的元素應該是位於中間元素的前面,我們可以把第二個指標指向中間元素,這樣也可以縮小尋找的範圍。

按照上述的思路,第乙個指標總是指向前面的遞增陣列的元素,而第二個指標總是指向後面遞增的陣列;最終第乙個指標將指向前面子陣列的最後乙個元素,而第二個指標會指向後面子陣列的第乙個元素。也就是他們會最終指向兩個相鄰的元素,而第二個指標指向的元素剛好是最小的元素(這也是迴圈結束的條件)。

package 旋轉的排序陣列;

public class solution

int low=0;

int high=array.length-1;

while(lowarray[high])else if(array[mid]==array[high])else

}return array[high];} }

下面是測試程式

package 旋轉的排序陣列;

劍指offer 陣列

資料是最簡單的資料結構,它佔據一塊連續的記憶體並按照順序儲存資料。建立陣列時,首先指點陣列的容量大小,然後根據大小分配記憶體。缺點 空間效率不高。經常有空閒的區域滅有得到充分利用。優點 時間效率很高。可以根據時間效率高的特點,來實現簡單的雜湊表 把陣列的下標設為雜湊表的鍵值,陣列中的每乙個數字設為雜...

劍指offer 陣列

public class 03 陣列中的重複數字 swap number,number i i return 1 交換 public void swap int number,int i,int j public class 03 陣列中的重複數字 return 1 public intfindre...

劍指offer 陣列

問題描述 在乙個二維陣列中 每個一維陣列的長度相同 每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。function find target,array return false 問題描述 在乙個長度...