題目:有一個長度為 n 的非降序數(shù)組,比如[1,2,3,4,5],將它進行旋轉(zhuǎn),即把一個數(shù)組最開始的若干個元素搬到數(shù)組的末尾,變成一個旋轉(zhuǎn)數(shù)組,比如變成了[3,4,5,1,2],或者[4,5,1,2,3]這樣的。請問,給定這樣一個旋轉(zhuǎn)數(shù)組,求數(shù)組中的最小值。
//暴力法import java.util.ArrayList;public class Solution { public int minNumberInRotateArray(int [] array) { int i3=-1; for (int i=0;ii2){ i3=i2; break; } } if(i3==-1){ i3=array[0]; } return i3; }}
二分查找解析:1、初始化:分別聲明i,j為array數(shù)組的左右兩端;2、循環(huán)二分:設(shè) m=(i+j)/2("/"為除法的向下取整),當 array[m] > array[j] 時: m 一定在左排序數(shù)組中,即旋轉(zhuǎn)點 x 一定在 [m + 1, j] 閉區(qū)間內(nèi),因此執(zhí)行 i = m + 1;3、當 array[m] < array[j] 時: m 一定在右排序數(shù)組中,即旋轉(zhuǎn)點 x 一定在[i, m]閉區(qū)間內(nèi),因此執(zhí)行 j = m4、當 array[m] = array[j] 時: 無法判斷 mm 在哪個排序數(shù)組中,即無法判斷旋轉(zhuǎn)點 x 在 [i, m] 還是 [m + 1, j] 區(qū)間中。解決方案: 執(zhí)行 j = j - 1 縮小判斷范圍5、返回值: 當 i = j 時跳出二分循環(huán),并返回 旋轉(zhuǎn)點的值 array[i] 即可。
//實際題目想要考察的是:二分查詢import java.util.ArrayList;public class Solution { public int minNumberInRotateArray(int [] array) { if(array.length==0){ return 0; } //最左邊指針 int i=0; //最右邊指針 int j=array.length-1; //循環(huán) while(iarray[j]){ i=m+1; } //m在右排序數(shù)組中,旋轉(zhuǎn)點在[i,m]中 else if(array[m]