1. 程式人生 > 其它 >旋轉陣列的最小數字-用二分法的變形解決(雖然多此一舉)

旋轉陣列的最小數字-用二分法的變形解決(雖然多此一舉)

下邊將是我的程式碼(超級無敵完整版)


看圖結合程式碼想比較好想,注意除特殊情況外最小值總在無序的那側哦~
程式碼如下:

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

完 ~