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

题目描述:

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [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];
    }
}

Python解法:

def maxNumReverse(nums):
    i = 0
    j = len(nums) - 1
    while i < j:
        mid = i + (j - i) // 2
        if nums[mid] > nums[j]:
            i = mid + 1
        elif nums[mid] < nums[j]:
            j = mid
        else:
            j -= 1
    return nums[i]

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容