本文算法使用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. 虚拟机下linux 系统网卡配置、固定IP地址

    1.进入该目录下修改内容 vi       /etc/sysconfig/network-scripts/  ifcfg-eth0 TYPE=Ethernet BOOTPROTO=static DEF ...

  2. 典型的 ajax 异步请求及错误处理

    $.ajax({ url: path + '/emergency/saveEmergency.do', async: false,//同步,会阻塞操作 type: 'POST',//PUT DELET ...

  3. python在lxml中使用XPath语法进行#数据解析

    在lxml中使用XPath语法: 获取所有li标签: from lxml import etree html = etree.parse('hello.html') print type(html) ...

  4. Applied Cloud Deep Semantic Recognition: Advanced Anomaly Detection(应用云深层语义识别:高级异态检测)

    亚马逊链接 引言 (by Mehdi Roopaei & Paul Rad) 异态检测与情境感知 在数据分析领域,异态检测讲的是在一个数据集中,发现到其中不符合预期模式的物体,动作,行为或事件 ...

  5. UPDATE_ENTITY実行

    1.クラスZCL_Z_EPM_RKT_DPC_EXTのクラスビルダ画面から.SALESORDERS_UPDATE_ENTITYメソッドを選択し.右クリックで.再定義をクリックします. 2.以下のソース ...

  6. DATA 转 16 进制

    // 转 16进制 编码 NSData *data = [NSData dataWithBytes:(const void *)dataOut length:(NSUInteger)dataOutMo ...

  7. 3680: 吊打XXX

    3680: 吊打XXX 链接 思路: 模拟退火. 代码: 跑的特别慢... #include<cstdio> #include<algorithm> #include<c ...

  8. Ubuntu adb 报错:no permissions (user in plugdev group; are your udev rules wrong?);

    Ubuntu 下 adb 报错: caoxinyu@caoxinyu-ThinkPad-T470p:~/Android/Sdk/platform-tools$ ./adb devices List o ...

  9. 微信小程序学习笔记(1)- 按钮触发的函数的定义以及不同页面之间的数据传递

    <view class='item' bindtap='onCountryTab' data-idx='4'> 1)bindtap属性用来设置控件需要绑定的函数,函数用单引号括起来:. 2 ...

  10. Python对象引用问题总结

    对于对象引用问题,一直是一知半解的状态,现整理以备使用. 操作不可变对象进行加减运算时,会在内存中创建新的不可变实例,不会影响原来的引用>>> c=12>>> d= ...