算法刷题笔记-旋转数组中的最小的元素

171 阅读1分钟

参考:B站UP--子烁爱学习(推荐大家观看原视频)

  • 题目描述:


  • 题目解析

    • 举个例子1-2-3-4-5,旋转3-4-5-1-2,旋转过去的部分是1-2,留下的部分是3-4-5。

    • 首先,1-2这一部分肯定是小于等于留下部分3-4-5的最开头的数字的,而且最小的元素也肯定是在旋转的部分中。

    • 这样就可以从后往前遍历,取留下部分最开头的数字小的数字之中最小的数字即可。

    • 折半查找

      • 12345-->34512,这样我们取中间的数字进行比较,中间是5,这个数字是比左边开头大,也比右边结尾大的,那么这时候就将左边的标志移动到5这个位置,右边不变,这时候,再取中间,中间是1,这个数字就是比右边尾巴小,也比左边头大,那么此时就将右边的标志移动到1这个位置,此时右边的标志—左边的标志==1,这时候,就能确定范围内只剩下两个数字,那么就只要比较这两个就好了

  • 代码示例:

    public class Algorithm06 {
        public int minNumberInRotateArray(int [] array) {
            int left=0;
            int right=array.length-1;
            
            while(left<right){
                //这个mid必须放在这里,因为mid是left和right的中间(包括更新后的),这样才能缩小范围
                int mid=(left+right)/2;
                if(right-left==1){
                    return Math.min(array[left],array[right]);
                }
                if(array[mid]>=array[left]){
                    left=mid;
                }
                if(array[mid]<=array[right]){
                    right=mid;
                }
            }
            return 0;
        }
    }