刷题笔记(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),已完结!!!

刷题记录-剑指offer11:旋转数组的最小数字

Leetcode刷题Python剑指 Offer 11. 旋转数组的最小数字

leetcode刷题31.旋转数组的最小数字——Java版

《剑指 Offer(第 2 版)》系列刷题