ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【JZ-11】旋转数组的最小数字(二分查找)

2021-03-04 17:58:23  阅读:190  来源: 互联网

标签:11 二分 JZ 元素 high 中轴 numbers pivot low


题目

在这里插入图片描述

方法一-二分法

数组最后一个元素为 x ,在最小元素右侧的元素,它们的值一定都小于等于 x ;在最小元素左侧的元素,它们的值一定都大于等于 x 。
在二分查找每一步中,设左边界为 l o w low low,右边界为 h i g h high high,区间中点为 p i v o t pivot pivot。将中轴元素 n u m b e r s [ p i v o t ] numbers[pivot] numbers[pivot] 与右边界元素 n u m b e r s [ h i g h ] numbers[high] numbers[high] 进行比较:

  1. 当 n u m b e r s [ p i v o t ] < n u m b e r s [ h i g h ] numbers[pivot] < numbers[high] numbers[pivot]<numbers[high]时,说明中轴元素在最小元素右侧,可以忽略查找区间的右半部分。
  2. 当 n u m b e r s [ p i v o t ] > n u m b e r s [ h i g h ] numbers[pivot] > numbers[high] numbers[pivot]>numbers[high]时,说明中轴元素在最小元素左侧,可以忽略查找区间的左半部分。
  3. 当 n u m b e r s [ p i v o t ] = n u m b e r s [ h i g h ] numbers[pivot] = numbers[high] numbers[pivot]=numbers[high]时,无法判断中轴元素和最小元素的位置关系,但可以确保无论右边界元素是不是最小元素,都存在替代品,即中轴元素,所以可以忽略右边界元素,即,将区间右端向左缩小一位继续查找。
class Solution {
    public int minArray(int[] numbers) {
        int low = 0;
        int high = numbers.length - 1;
        while(low < high){
            int pivot = low + (high - low)/2;
            if(numbers[pivot] < numbers[high]){
                high = pivot;//中轴元素小于右边界元素,中轴元素也可能是最小元素
            }else if(numbers[pivot] > numbers[high]){
                low = pivot + 1;//中轴元素大于右边界元素,所以中轴元素一定不是最小元素
            }else{
                high -= 1;
            }
        }
        return numbers[low];
    }
}

notes:关于二分时用的是 l o w + ( h i g h − l o w ) / 2 low + (high - low)/2 low+(high−low)/2而非 ( l o w + h i g h ) / 2 (low + high)/2 (low+high)/2,是为了避免两数相加时发生溢出。

  • 时间复杂度:平均时间复杂度为 O ( l o g n ) O(log n) O(logn),其中n为数组长度;最坏情况下,数组中元素完全相同,while循环就要执行 n 次,时间复杂度为 O ( n ) O(n) O(n)
  • 空间复杂度: O ( 1 ) O(1) O(1)

标签:11,二分,JZ,元素,high,中轴,numbers,pivot,low
来源: https://blog.csdn.net/qq_38001377/article/details/114373498

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有