旋轉陣列的最小數字-用二分法的變形解決(雖然多此一舉)
阿新 • • 發佈:2021-10-26
下邊將是我的程式碼(超級無敵完整版)
看圖結合程式碼想比較好想,注意除特殊情況外最小值總在無序的那側哦~
程式碼如下:
package 遞迴基礎小題; /** * @author 鄧雪松 (づ ̄ 3 ̄)づ) * @create 2021-10-26-17-14 */ public class Case01_旋轉陣列的最小數字 { static int min(int[] arr){ int begin = 0; int end = arr.length - 1; //考慮沒有旋轉這種特殊的旋轉 if(arr[begin]<arr[end]) return arr[begin]; //注意是begin+1<end 與 return arr[end]相對應 //也就是begin+1=end時退出->begin與end是相鄰元素,退出 while(begin+1<end){ int mid = begin + ((end-begin)>>1); //如果mid元素與begin元素和end元素都相等 如1,0,1,1,1 如果還用這種二分的變種方法那麼就錯了呀,這也是這種解法的bug //所以當遇見這種情況的時候就用普通方法找就好了 if(arr[begin]==arr[mid]&&arr[begin]==arr[end]){ arr[end] = pt(arr); break; } // 要麼左側有序,要麼右側有序 if(arr[mid]>=arr[begin]){ //左側有序 begin = mid; }else{ end = mid; } } return arr[end]; } static int pt(int[] arr){ int min = arr[0]; for (int i = 1; i < arr.length; i++) { if(arr[i]<min) min = arr[i]; } return min; } public static void main(String[] args) { int[] arr = {2,3,4,5,1}; int res = min(arr); System.out.println(res); int[] arr2 = {1,0,1,1,1}; int min = min(arr2); System.out.println(min); } }
執行結果如下:
1
0
完 ~