旋轉陣列的最小數字

2021-07-23 05:36:05 字數 1920 閱讀 4648

題目: 把乙個陣列最

旋轉陣列的特點:

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

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

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

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

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

思路:

1. 設定兩個指標,初始狀態第乙個指標指向前面子陣列的第乙個元素,第二個指標指向後面子陣列的最後乙個元素

2. 找到兩個指標的中間元素;

3.若其大於等於第乙個指標指向的元素,則說明其在前面的子陣列中,且顯然最小元素在中間元素的右邊,若其小於等於第二個指標指向的元素,則說明其在後面的子陣列中,且顯然最小元素在中間元素的左邊

如此,便可以縮小搜尋範圍,減少時間複雜度,最終第乙個指標指向前面子陣列的最後乙個元素,而第二個指標指向後面子陣列的第乙個元素,它們處於相鄰位置,而第二個指標指向的剛好是最小的元素。

注意:當兩個指標指向的數字及它們中間的數字三者相等時,無法判斷中間數字位於前面的子陣列還是後面的子陣列,也就無法移動兩個指標來縮小查詢的範圍,此時只能用順序查詢的方法。

例如:陣列和陣列都可看成是遞增陣列的旋轉。第一種情況,中間數字位於後面的子陣列,第二種情況,中間數字位於前面的子陣列。

(5)按旋轉規則,第乙個元素應該是大於或等於最後乙個元素的;

但也有特例:若把排序陣列的前0個元素搬到最後面,及排序陣列本身,仍是陣列的乙個旋轉,此時陣列中的第乙個數字是最小的數字。

public

class reverseminnumber08 else

if(nums[mid]//若中間元素小於首部元素(說明是在後面的遞增子陣列中),則說明,最小的元素應該在前半部分,此時將指向尾部的etd指向中間位置

etd=mid;

}//當st,etd,mid所指位置元素都相等時,無法判斷,則需要使用順序查詢的方法

else

if(nums[st]==nums[mid] && nums[etd]==nums[mid])

}return nums[etd];

}//順序查詢

public

intsetpsearch(int nums)

}

return result;

}public

static

void

main(string args) ;

int nums2 = new

int;

int nums3 =new

int;

int nums4 = new

int;

reverseminnumber08 r = new reverseminnumber08();

system.out.println(r.search(nums));

system.out.println(r.search(nums2));

system.out.println(r.search(nums3));

system.out.println(r.search(nums4));

}}

result:

200

0

參考:

c++版本:

旋轉陣列最小數字

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