問題:
把一個數(shù)組最開始的若干元素搬到數(shù)組末尾
輸入一個遞增排序數(shù)組的一個旋轉隙畜,輸出該元素的最小值
如{3抖部,4,5议惰,1慎颗,2}為{1,2换淆,3哗总,4几颜,5}的一個旋轉數(shù)組
輸出最小值為1
思路:
遞增數(shù)組的旋轉倍试,二分法思維,中間值分成兩個區(qū)域蛋哭,一定一邊有序县习,一邊無序。
中間值比最左值大 左側有序 否則 右側有序
且最小的數(shù)一定在無序的一側(因為最小的數(shù)一定是原數(shù)組中第一個數(shù))每次切掉
有序的一半谆趾,直到剩下兩個元素躁愿,最小的數(shù)一定是第二個數(shù)。
如果原數(shù)組是特殊的形如全部相等元素的數(shù)組沪蓬,則考慮遍歷法找到最小的數(shù)彤钟。
(Java代碼參考)
public static void main(String[] args) {
int[] a = {3,4,5,1,2};
// int[] a = {1,1,1,0,1};
int res = min(a);
System.out.println(res);
}
static int min(int[] arr) {
int begin = 0;
int end = arr.length-1;
//沒有旋轉
if(arr[begin] < arr[end]) return arr[begin];
//直到只剩兩個元素結束
while(begin + 1 < end) {
int mid = begin + ((end - begin)>>1);
if(arr[begin] == arr[mid] || arr[end] == arr[mid]) {//特殊數(shù)組
int minIndex = 0;
int min = arr[0];
for(int i = 0; i < arr.length; i++) {
if(arr[i] < min) {
minIndex = i;
min = arr[i];
}
}
return arr[minIndex];
}
if(arr[mid] > arr[begin]) {//左邊有序
begin = mid;
}else {//右邊有序
end = mid;
}
}
return arr[end];//最后剩兩個數(shù),右邊的一定是最小的
}