剑指offer系列6之旋转数组的最小值

要求

  • 时间限制:3秒
  • 空间限制:32768K
  • 热度指数:461399
  • 本题知识点: 查找

题目描述

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。

思路

思路一:顺序查找

若数组为空直接返回0;若数组不为空,则顺序遍历数组,直到遇到当前值比后一个值大的情况,此时直接返回后一个值,如果遍历完数组也没找到满足条件的情况,则直接返回数组的最后一个值。此算法的时间复杂度为 O ( n ) O(n) O(n)

python实现
# -*- coding:utf-8 -*-
class Solution:
    def minNumberInRotateArray(self, rotateArray):
        # write code here
        length = len(rotateArray)
        if length == 0:
            return 0
        for i in range(length-1):
            if rotateArray[i] > rotateArray[i+1]:
                return rotateArray[i+1];
        return rotateArray[length-1]
    
  • 运行时间:678ms
  • 占用内存:5852k
C++实现
class Solution {
public:
    int minNumberInRotateArray(vector<int> rotateArray) {
        int length = rotateArray.size();
        if(length==0)
            return 0;
        for(int i=0; i<length-1; i++){
            if (rotateArray[i]>rotateArray[i+1])
                return rotateArray[i+1];
        }
        return rotateArray[length-1];
    }
};
  • 运行时间:38ms
  • 占用内存:504k
思路二:二分法查找

二分法查找的思路可以使时间复杂度降为 O ( l o g n ) O(logn) O(logn),但是当所有元素值都相等时,该方法时间复杂度会退化到 O ( n ) O(n) O(n)。具体执行方法如下:

  1. 初始化low,mid,high
  2. 比较a[mid]与a[high]:若前者大,则表明最小值一定在mid右边;若相等,则无法确定最小值在mid左边还是右边,这时候只能一个个试,high值减一;若前者小,则说明最小值一定为mid或者在mid的左边。
python实现
# -*- coding:utf-8 -*-
class Solution:
    def minNumberInRotateArray(self, rotateArray):
        # write code here
        low = 0
        high = len(rotateArray) - 1
        while low < high:
            mid = low + (high - low) / 2
            if rotateArray[mid] > rotateArray[high]:
                low = mid + 1
            elif rotateArray[mid] == rotateArray[high]:
                high = high - 1;
            else:
                high = mid;
        return rotateArray[low];
    
  • 运行时间:1078ms
  • 占用内存:5732k
C++实现
class Solution {
public:
    int minNumberInRotateArray(vector<int> rotateArray) {
        int low = 0;
        int high = rotateArray.size() - 1;
        int mid = 0;
        while (low < high){
            mid = low + (high-low)/2;
            if (rotateArray[mid] > rotateArray[high])
                low = mid + 1;
            else if (rotateArray[mid] == rotateArray[high])
                high = high - 1;
            else if (rotateArray[mid] < rotateArray[high])
                high = mid;
        }
        return rotateArray[low];
    }
};
  • 运行时间:31ms
  • 占用内存:608k
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值