題目: 把乙個陣列最
旋轉陣列的特點:
(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.分析 首先我們可以看到原陣列為遞增排序的,並且以...