旋转数组的最小数字-用二分法的变形解决(虽然多此一举)

下边将是我的代码(超级无敌完整版)


看图结合代码想比较好想,注意除特殊情况外最小值总在无序的那侧哦~
代码如下:

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

完 ~

posted @ 2021-10-26 18:00  ╰(‵□′)╯  阅读(28)  评论(0编辑  收藏  举报