zoukankan      html  css  js  c++  java
  • 剑指offer——06旋转数组的最小数字(Python3)

    题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。

    NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。

    知识点:查找(二分查找)

    思路:

    题上说明数组是一个旋转的非减排序数组,即1:参数数组为一个有序非递减数组;2.数组旋转后分为两部分,即原始位置和旋转位置。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,则{3,4,5}为原始数组,{1,2}为旋转数组。我们可以利用二分查找,设置两个指针来查找原始数组的尾部和旋转数组的头部,进而判定最小位置。

    如果中间位置位于原始数组,那么它应该大于等于头指针,此时数组中最小的元素应该位于该中间元素的后面;如果中间元素位于后面的旋转数组,那么它应该小于等于尾指针,此时该数组的最小元素应该位于该中间元素的前面。

    最终头指针会指向原始数组的尾部,尾指针会指向旋转数组的头部。

    如果遇到头指针、尾指针和中间元素相等的情况,即{1,0,1,1,1},无法判断,只能利用顺序查找方法。

    代码:

    class Solution:
    def minNumberInRotateArray(self, rotateArray):
    '''

    :param rotateArray: 输入的旋转数组
    :return: 数组中的最小值
    '''
    # write code here
    #设置两个指针,指向数组下标
    index_1 = 0#设置头指针
    index_2 = len(rotateArray) - 1#设置尾指针
    min = index_1
    #尾指针始终指向后面的递增数组,头指针始终指向前面的递增数组
    #最终头指针指向前面数组的最后一个元素,尾指针指向后面数组的最后一个元素
    while rotateArray[index_1] >= rotateArray[index_2]:#当头指针超过尾指针时,跳出循环
    if index_2 - index_1 ==1:#判断输出条件
    min = index_2
    break
    min = int((index_1+index_2)/2)#找出中间元素
    #无法判断位置时,(当头指针、尾指针和中间相同时)采用顺序查找
    if rotateArray[index_1] ==rotateArray[index_2] and rotateArray[index_1]==rotateArray[min]:
    for i in range(index_1, index_2 + 1):
    if rotateArray[i] < rotateArray[min]:
    min = i
    return rotateArray[min]
    #开始使用二分查找
    if rotateArray[index1] <= rotateArray[min]:
    index1 = min
    elif rotateArray[min] <= rotateArray[index2]:
    index2 = min
    return rotateArray[min]
  • 相关阅读:
    Oracle ref cursor和sys_refcursor
    一些命令可以帮您了解Linux 操作系统用户信息
    Linux 6上使用UDEV绑定共享存储
    Oracle VirtualBox 问题汇总
    Linux 常用操作
    CentOS 7 运行级别切换
    Oracle 更新Opatch、打补丁
    django rest framework restful 规范
    CBV FBV rest framework
    CRM
  • 原文地址:https://www.cnblogs.com/wobushangwangl/p/10920052.html
Copyright © 2011-2022 走看看