剑指offer---求旋转数组的最小数字

题目描述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的 旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如 数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。NOTE:给出的所 有元素都大于0,若数组大小为0,请返回-1。假设数组中不存在重复元素。
思路:利用二分法,找到数组的中间元素mid。如果中间元素>数组第一个元素, 在mid右边搜索变化点。如果中间元素<数组第一个元素,我们需要在mid左边 搜索变化点。当找到变化点时停止搜索,满足nums[mid]>nums[mid+1] (mid+1是最小值)或nums[mid-1]>nums[mid](mid是最小值)即可。

package Function;
//利用二分法,找到数组的中间元素mid。如果中间元素>数组第一个元素, 在mid右边搜索变化点。
// 如果中间元素<数组第一个元素,我们需要在mid左边 搜索变化点。
// 当找到变化点时停止搜索,
// 满足nums[mid]>nums[mid+1] (mid+1是最小值)
// 或nums[mid-1]>nums[mid](mid是最小值)即可。
//:二分查找(找变化点),时间复杂度:O(logn),空间复杂度:O(1)
public class minInReversingList11 {
    public static int minInReversingList(int[] array) {
        if (array == null || array.length == 0) {
            return -1;
        }
        if (array.length == 1 || array[array.length - 1] > array[0]) { return array[0]; }
        int left = 0;
        int right = array.length - 1;
        while (left <= right) {
            int mid = (left + right) / 2;
            //如果中间元素>数组第一个元素, 在mid右边搜索变化点。
            if (array[mid] > array[mid + 1]) {
                return array[mid + 1];
            }
            //如果中间元素<数组第一个元素,我们需要在mid左边 搜索变化点
            if (array[mid - 1] > array[mid]) {
                return array[mid];
            }
            //满足nums[mid]>nums[mid+1] (mid+1是最小值)
           // 或nums[mid-1]>nums[mid](mid是最小值)即可
            if (array[mid] > array[0]) {
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }
        return -1;
    }
    public static void main(String[] args) {
        int []arr1=new int[]{1,1,1,0,1};
        int[]arr2={1,0,1,1,1};
        minInReversingList11 p=new minInReversingList11();
        int b=p.minInReversingList(arr2);
        System.out.println(b);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值