美文网首页
面试题11. 旋转数组的最小数字

面试题11. 旋转数组的最小数字

作者: 周英杰Anita | 来源:发表于2020-02-26 15:34 被阅读0次

题目描述:

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。

示例 1:

输入:[3,4,5,1,2]
输出:1

示例 2:

输入:[2,2,2,0,1]
输出:0

思路:

1、首先看旋转数组的特点,也是一个旋转部分元素的有序数组,前一部分和后一部分都是递增的,可以使用二分法查找;
2、首先找到中间元素numbers[mid],如果该numbers[mid]大于 numbers[j],那么 numbers[mid]是位于前一部分递增数组中的,调整左边界i = mid + 1;
3、如果该numbers[mid]小于 numbers[j],那么 numbers[mid]是位于后一部分递增数组中的,那么最小值一定等于numbers[mid]或者位于numbers[mid]的前面,因此调整右边界 j= mid ; 
4、如果numbers[mid]等于 numbers[j],那么从mid就无法判断到底是在前一部分递增数组中,还是后一部分递增数组中,例如[1,0,1,1,1]和 [1, 1, 1, 0, 1],只能把numbers[j]排除掉,因此j --;
5、当条件不满足时也就是i==j ,就能找到该最小值,返回numbers[i]即可;

Java解法:

class Solution {
    public int minArray(int[] numbers) {
        int i = 0;
        int j = numbers.length - 1;
        while(i < j)
        {
            int mid = (i + j) / 2;
            if(numbers[mid] > numbers[j]) i = mid + 1;
            else if (numbers[mid] < numbers[j]) j = mid;
            else j--;
        }
        return numbers[i];
    }
}

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/xuan-zhuan-shu-zu-de-zui-xiao-shu-zi-lcof

相关文章

网友评论

      本文标题:面试题11. 旋转数组的最小数字

      本文链接:https://www.haomeiwen.com/subject/askvchtx.html