本文算法使用python3实现


1.题目描述:

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

  时间限制:3s;空间限制:32768K


2.思路描述:

  思路主要有以下两种:

  (1)暴力法:从头到尾遍历数组,找到最小值。该方法的时间复杂度为 $ O(n) $ ,当数组过大时,遍历时间较长,并且此方法并没有应用上“翻转数组”的特点。

  (2)折半查找法(二分查找):时间复杂度为 $ O(\log_2n) $ ,且可以利用本题“翻转”数组的特点。

  但是需要考虑两种情况!!!

  (1)存在重复数字,例如[1,0,1,1,1],使用暴力查找法,因为此时无法利用折半查找法里的一些判断条件。参考下图:

      

  (2)不存在重复数字,例如[3,4,5,1,2],使用折半查找法,参考下图:

    (a)将指针 $ low $ 指向数组第0项, $ high $ 指向数组第n项。

    (b)指针 $ mid = (low+high)//2 $ ,若 $ array[mid]>=array[low] $ 且 $ array[mid]>array[high] $ ,此时移动指针 $ low=mid $ ;若 $ array[mid]<array[low] $ 且 $ array[mid]<=array[high] $ ,此时移动指针 $ high=mid $ 。重复(b)直到 $ low+1=high $ ,进入(c)

    (c)比较 $ array[low] $ 与 $ array[high] $ ,返回其中较小值。

      


3.程序代码:

class Solution:
def minNumberInRotateArray(self, rotateArray):
if len(rotateArray) == 0:
return 0
#array = sorted(rotateArray)
#return array[0]
low = 0
high = len(rotateArray) - 1
while low + 1 < high:
mid = (low+high)//2
# 当数组为:[1,0,1,1,1]时,只能使用暴力解法
if rotateArray[mid] == rotateArray[low] and rotateArray[mid] == rotateArray[high]:
return self.findmin(rotateArray)
# 当数组正常时,例如:[3,4,5,1,2],使用二分查找法。
# 注意等号:[3,0,1,1,1],[3,3,3,0,1]这两种情况
if rotateArray[mid] >= rotateArray[low] and rotateArray[mid] > rotateArray[high]:
low = mid
continue
if rotateArray[mid] < rotateArray[low] and rotateArray[mid] <= rotateArray[high]:
high = mid
continue
if low + 1 >= high:
return rotateArray[low] if rotateArray[low] < rotateArray[high] else rotateArray[high] def findmin(self,rotateArray):
''‘暴力解法’''
min = rotateArray[0]
for ele in rotateArray:
if ele < min:
min = ele
return min

《剑指offer》---寻找反转数组最小值的更多相关文章

  1. [剑指 Offer 11. 旋转数组的最小数字]

    [剑指 Offer 11. 旋转数组的最小数字] 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如,数组 [3,4,5, ...

  2. 《剑指offer》旋转数组中的最小数字

    本题来自<剑指offer> 旋转数组中的最小数字 题目: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素. 例 ...

  3. 剑指Offer:把数组排成最小的数【45】

    剑指Offer:把数组排成最小的数[45] 题目描述 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如,输入数组是{3.32.321},则打印出来的这3 ...

  4. 剑指Offer:旋转数组的最小数字【11】

    剑指Offer:旋转数组的最小数字[11] 题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4 ...

  5. ⛅剑指 Offer 11. 旋转数组的最小数字

    20207.22 LeetCode 剑指 Offer 11. 旋转数组的最小数字 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小 ...

  6. 【剑指Offer】旋转数组中的最小数字 解题报告(Python)

    [剑指Offer]旋转数组中的最小数字 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https://www.nowcoder.com/ta/coding-intervie ...

  7. 剑指offer:调整数组顺序使奇数位于偶数前面

    题目 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 分析 事实上,这个题比较简单,很多种方式都可以实现,但是其时间复杂度或空间复 ...

  8. 《剑指offer》把数组排成最小的数

    本题来自<剑指offer> 反转链表 题目: 思路: C++ Code: Python Code: 总结:

  9. 《剑指offer》 反转链表

    本题来自<剑指offer> 反转链表 题目: 输入一个链表,反转链表后,输出新链表的表头. 思路: 需要三个变量,来保存当前节点的,前面节点和反转后的节点. C++ Code: /* st ...

  10. 《剑指offer》 调整数组顺序使得奇数在偶数前面

    本题来自<剑指offer> 调整数组顺序使得奇数在偶数前面 题目: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分, ...

随机推荐

  1. JSP + servlet 源码 实现文件的上传

    JSP页面 upLoad.jsp _________________________________ <%@ page language="java" import=&quo ...

  2. while 循环,格式化输出和运算编码

    今日内容 1.while循环 while Ture:             content = input ("请输入你要喷的内容",输入Q退出)             if ...

  3. hadoop的自定义分组实现 (Partition机制)

    hadoop开发中我们会遇到类似这样的问题,比如 如何将不同省份的手机号分别输出到不同的文件中,本片文章将对hadoop内置的Partition类进行重写以解决这个问题. MapReduce的使用者通 ...

  4. pyhton新手学习之增删改查

    一 .列表的定义 1.列表的定义     names = [ "xiajiqni", "test", "wangwu","oldb ...

  5. 【普及】NOIP2011 瑞士轮

    用sort会超时,显而易见. 然后想到了归并.至于为什么把运动员分成输与赢两组,我也不是很清楚,也许换种方式分组也行,但是分成输与赢两组更容易分组与合并. #include<iostream&g ...

  6. elasticsearch集群整合elqsticsearch-sql插件

    1.本来整合这个插件是比较简单易操作的,但是由于公司从AWS下载禁掉了,给安装带来一些麻烦, 采用离线安装,先FQ将elasticsearch-sql-5.1.2.0.zip下载下来: ./bin/e ...

  7. EDM站点

    设计邮件模版 http://templates.mailchimp.com/

  8. 数据库c3p0配置文件

    <?xml version="1.0" encoding="UTF-8"?> <c3p0-config> <default-con ...

  9. Java - 无乱码读写文件

    Java读取数据流的时候,一定要指定数据流的编码方式,否则将使用本地环境中的默认字符集. BufferedReader reader = null; String laststr = "&q ...

  10. leetcode笔记9 Move Zeroes

    题目要求: Given an array nums, write a function to move all 0's to the end of it while maintaining the r ...