zoukankan      html  css  js  c++  java
  • 《剑指offer》面试题7:旋转数组的最小数字

     题目描述

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

    解题思路:

    1.如果使用暴力查找法,则可以迅速求解,但是使用这种方法绝对不可能通过面试,达不到面试官考察的要求,求解的方法如下:

    class Solution:
        def minNumberInRotateArray(self, rotateArray):
            # write code here
    
            #也可以直接使用暴力求解法得解,虽然暴力求解法,也就是打擂台算法也可,但是
            #其所需要计算的时间太多,没有考虑到我们的时间复杂度的问题
    
            if len(rotateArray)==0:
                return 0
            min=rotateArray[0]
            for i in rotateArray:
                if i<min:
                    min=i
            return min

    2.使用二分查找法求解,二分查找法的精髓并不是查找一个有序数列当中的某一个数值,而是通过把一个数组进行二分后,再进行查找的思想。因此我们将其修改为:

    假设有一个数组:【3,4,5,1,2,3】

    left是数组当中进行比较数组的最左边一个数字

    right是数组当中进行比较数组当中最右边的一个数字

    如果Mid小于了前面的数字,(1<5)那么我们找到了最小数字
    我们的目的就是找到一个数字比前面的数字更小
    后面的操作相当于不断改变查找数组长度的过程
    如果mid小于了最后的数字,那么right=mid-1
    如果mid大于了最后的数字,那么left=mid+1

    这样不断地进行移位操作,也就是不断变化数组当中的left和right,最终就可以夹逼得到mid的数值小于了前面的数字,这样这个mid一定使我们所寻找到的最小的数字。

    代码如下:

    # -*- coding:utf-8 -*-
    class Solution:
        def minNumberInRotateArray(self, rotateArray):
            if len(rotateArray)==0:
                return 0
            left=0
            right=len(rotateArray)-1#-1这个操作非常玄乎....
            while left<=right:
                mid=(left+right)//2
                if rotateArray[mid]<rotateArray[mid-1]:
                    return rotateArray[mid]
                elif rotateArray[mid]<rotateArray[right]:
                    right=mid-1
                elif rotateArray[mid]>rotateArray[right]:
                    left=mid+1
    得解也!
  • 相关阅读:
    联合省选 2020 题解
    [省选联考 2020 A 卷] 组合数问题
    【NOI2016】循环之美
    MySQL 之 json 数据操作
    使用Redis和定时实现延时消费
    事务,这次还有不清楚的吗,一次实战坑
    哨兵redis配置
    记录一次shell脚本的使用
    记录一次工作中的SQL优化,临时表和CountDownLatch
    JAVA流读取文件并保存数据
  • 原文地址:https://www.cnblogs.com/geeksongs/p/13475716.html
Copyright © 2011-2022 走看看