旋转数组中的最小数字(中)
Posted 小布丁value
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了旋转数组中的最小数字(中)相关的知识,希望对你有一定的参考价值。
无重复元素
if numbers[mid]>numbers[right] 说明前面有序,最小值一定在后面
left=mid+1
if numbers[mid]<numbers[right] 说明后半部分一定有序,最小值在前面
right=mid;
模拟整个过程会发现当 left==right时退出循环
找到numbers[left]即位最小值
有重复元素
如果有重复元素
numbers[right]=numbers[left]
right–;
不等的时候又按照无重复元素进行判断即可
代码实现如下:
class Solution {
public int minArray(int[] numbers) {
int left=0; int right=numbers.length-1;
while(left<right){
int mid=(left+right)/2;
if(numbers[mid]<numbers[right]) right=mid;
else if(numbers[mid]>numbers[right]) left=mid+1;
//考虑重复数字
else right--;
}
return numbers[left];
}
}
三个问题
为什么right–不会对结果产生影响
为什么right = mid 而left = mid+1;
时间复杂度
以上是关于旋转数组中的最小数字(中)的主要内容,如果未能解决你的问题,请参考以下文章