zoukankan      html  css  js  c++  java
  • 剑指Offer——旋转数组的最小数字

    题目:

    这道题有三种思路:

    1. 以第一个元素为最小值min,直接遍历一遍,每个元素都与min进行比较,当当前元素比最小值min小则更新min的值,这里的时间复杂度是O(n)
    2. 利用数组的特性,我们可以知道只要a[i+1] < a[i]那么就可以确定a[i+1]就是最小值,这里的时间复杂度大概是O(1)~O(n)之间,取决于最小值在哪
    3. 还是利用数组的特性:我们可以肯定,最左边的元素一定比最右边的元素大,这时候只需要取数组正中间的元素来进行比较,就可以确定中间的元素处于较大元素组成的区域(我们这里称之为左区)还是较小元素组成的区域(右区),确定的方法很简单,如果中间的元素比左边的大,那么可以确定在左区,就需要往右边搜索,如果比左边的元素小,那么定然是在右区,就要往左边找。时间复杂度在O(1)~O(n/2)之间

    1、2很简单,所以这里就不放出代码了,我们只看3:

    class Solution {
    public:
        int minNumberInRotateArray(vector<int> rotateArray) {
            int size = rotateArray.size();
            if(size == 0) {
                return 0;
            }
            
            int left = rotateArray[0];
            int right = rotateArray[size - 1];
            
            int idx = size / 2;
            int res = 0;
            while(idx > 0 && idx < size) {
                if(rotateArray[idx] > left && rotateArray[idx] <= rotateArray[idx + 1]) {
                    // 左区
                    ++idx;
                }
                else if(rotateArray[idx] < right && rotateArray[idx] >= rotateArray[idx - 1]) {
                    // 右区
                    --idx;
                }
                else {
                    // 此时我们在边界,但是不确定idx此时在左区最右边还是右区最左边
                    res = rotateArray[idx] > rotateArray[idx + 1] ? rotateArray[idx + 1] : rotateArray[idx];
                    break;
                }
            }
            return res;
        }
    };
    
  • 相关阅读:
    批量替换文本的工具
    wcf异常显示错误到客户端
    文件以二进制存入数据库和从数据库读取二进制文件
    关于关系数据库的范式
    对于挑战书上的很久之前都看不懂的DP看懂的突破
    操作系统概念
    关于P,V操作理解的突破,关于并发设计与并行
    关于快速沃尔什变换
    我觉得我应该养成经常翻收藏夹的习惯
    目前我的思考模式
  • 原文地址:https://www.cnblogs.com/yejianying/p/jianzhioffer_minNumberInRotateArray.html
Copyright © 2011-2022 走看看