刷题笔记(14)--旋转数组的最小数字
Posted HardyDragon_CC
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了刷题笔记(14)--旋转数组的最小数字相关的知识,希望对你有一定的参考价值。
旋转数组的最小数字
class Solution {
public int minArray(int[] numbers) {
int left = 0;
int right = numbers.length - 1;
// 利用二分查找的思想 使得left 和 right 落在最中间的两个位置,取其中最小的值
while(right - left > 1){
// 对左右去重
while(right - left > 1 && numbers[right-1] == numbers[right]){
right--;
}
while(right - left > 1 && numbers[left] == numbers[left+1]){
left++;
}
int mid = left + (right - left) / 2;
/*
将 mid 和 right 位置的元素做比较。正常是right的大于mid, 这里是找最小的,所以将left和right往最小范围移动。
这里能用 mid 和 left 比较么?旋转数组中min的出现情况有三种。
5 1 2 3 4 : left是5,mid 是2,right是4;(旋转后min在mid的左边)mid<left, mid<right
1 2 3 4 5: left-1, mid-3,right-5 ;(未旋转)mid>left, mid<right
3 5 1: left-3,mid-5,right-1 ; 遇到这种情况,最小值在右边。(旋转后min在mid的右边) mid>left, mid>right
当处于第2和3情况是,mid都是大于left,其操作却不能统一,2需要 right = mid; 3需要left = mid;所以不用mid和left比较。
如果对mid和right比较,1、2两种情况mid都是小于right的,可以统一操作right = mid;当mid大于right时left = mid即可。
因此使用mid和right比较可以减少if判断的条件,统一操作。
*/
if(numbers[mid] < numbers[right]){
right = mid;
}else{
left = mid;
}
}
return Math.min(numbers[left],numbers[right]);
}
}
以上是关于刷题笔记(14)--旋转数组的最小数字的主要内容,如果未能解决你的问题,请参考以下文章
力扣(LeetCode)剑指offer刷题笔记(java),已完结!!!
力扣(LeetCode)剑指offer刷题笔记(java),已完结!!!