题解 | #旋转数组的最小数字#

旋转数组的最小数字

http://www.nowcoder.com/practice/9f3231a991af4f55b95579b44b7a01ba

import java.util.ArrayList;
public class Solution {
    public int minNumberInRotateArray(int [] array) {
        int length = array.length;
        //特殊值处理,此时长度小,可以不用进入循环,提高效率
        if(length == 1){
            return array[0];
        }
        
        //特殊值处理
        if(array[0] < array[length-1]){
            return array[0];
        }
        
        int minValue = array[0];//临时最小值(minValue)
        int min = 0;//二分法,左指针
        int max = length-1;//二分法,右指针
        int mid = (min+max)/2;//二分法,中值
        while(min <= max){
            if(array[mid] == minValue){//中值与临时最小值相等
                int left = mid;
                while(left>min && array[left] == array[left-1]){//往左边寻找第一个与最小值不相等的下标索引
                    left--;
                }
                if(left==min){//左边到中值索引都是相等的,eg:2,2,2,1,2,此时最小值在中值索引右边
                    min = mid + 1;
                }else{//左边到中值索引之间有不相等的,eg:2,0,2,2,2,此时最小值在中值索引左边
                    max = mid - 1;
                }
            }else if(array[mid] > minValue){//中值大于临时最小值(minValue)
                min = mid + 1;
            }else {//中值小于临时最小值(minValue)
                if(array[mid]<array[mid-1]){//如果中值比前一个值小,则该中值是局部最小值,与临时最小值(minValue)比较,可以得到最小值
                    break;//退出循环
                }
                max = mid - 1;//如果中值比前一个值大,此时指针往左移动
            }
            mid = (min+max)/2;
        }
        
        return minValue<array[mid]?minValue:array[mid];//局部最小值(array[mid])与临时最小值(minValue)比较,可以得到最小值
    }
}
全部评论

相关推荐

不愿透露姓名的神秘牛友
06-05 15:27
点赞 评论 收藏
分享
吴offer选手:我卡在笔试才是最好笑的,甚至没给我发过笔试链接
投递哔哩哔哩等公司7个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务