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

旋转数组的最小数字

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

考察特殊的 二分查找

题干中有一个概念没有理解,导致想不明白题意:
非递减数组, 意思是:数组中没有任何部分是递减的! 122344

非递减数组的旋转,就是将后边一部分元素挪到了前面,导致原本处在第一位的最小元素去到中间了。
题目要找到并输出这个最小元素。
查找元素嘛, 二分查找法适用。

但是最小元素不知道,没有一个 target 去和 mid元素比。
其实也是可以做的,将某个端点值设为target即可。
而这个端点值不能随便选,一般选后面的。 可以在纸上做一下演草。

情况1 :1 2 3 4 5 , arr[mid] = 3. target = 1, arr[mid] > target, 答案在mid 的左侧
情况2 :3 4 5 1 2 , arr[mid] = 5, target = 3, arr[mid] > target, 答案却在mid 的右侧
所以不能把左端点当做target

public class Solution {
    public int minNumberInRotateArray(int [] array) {

        if (array.length==0) return 0;

        int low =0;
        int high = array.length-1;
        int mid = 0;

        while(low<high){
            if(array[low]<array[high]) return array[low];

            mid= low + ((high-low)/2);//mid 取值要这么取,防止int越界。
    // 二分查找常用于查找一个数target,当没有一个target的时候,可以选择一个端点值作为target。
            if(array[mid]>array[high]) 
                low=mid+1;
            else if (array[mid]<array[high]) 
                high=mid;
            else  --high;

        }
            return array[low];
    }
全部评论

相关推荐

10-06 12:46
门头沟学院 Java
跨考小白:定时任务启动
点赞 评论 收藏
分享
喜欢吃蛋糕仰泳鲈鱼是我的神:字节可以找个hr 给你挂了,再放池子捞
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务