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