博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
leetcode 【 Find Minimum in Rotated Sorted Array 】python 实现
阅读量:5732 次
发布时间:2019-06-18

本文共 2680 字,大约阅读时间需要 8 分钟。

题目

Suppose a sorted array is rotated at some pivot unknown to you beforehand.

(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).

Find the minimum element.

You may assume no duplicate exists in the array.

 

代码:oj测试通过 Runtime: 52 ms

1 class Solution: 2     # @param num, a list of integer 3     # @return an integer 4     def findMin(self, num): 5         # none case 6         if num is None: 7             return None 8         # short lenght case 9         if len(num)==1 :10             return num[0]11         # binary search12         start = 013         end = len(num)-114         while start<=end :15             if start==end :16                 return num[start]17             if start+1==end :18                 return min(num[start],num[end])19             mid = (start+end)/220             if num[mid]>num[start] :21                 if num[mid]>num[end] :22                     start = mid23                 else:24                     return num[start]25             else:26                 if num[mid]>num[end] :27                     return num[end]28                 else:29                     end = mid

 

思路

基本思路还是binary search。

注意修改start或end时的条件:因为mid也有可能是最小值,所以start=mid end=mid,这个跟传统二分查找时start=mid+1以及end=mid-1有所不同。

想明白这些后,代码一次AC。

 

 

 

【续】

自己的上一版代码还是太复杂的;复杂的原因是把binary search的常规套路生搬硬套,没有考虑这道题目要求的是最小值就可以了。

改进后的代码如下:

1 class Solution: 2     # @param num, a list of integer 3     # @return an integer 4     def findMin(self, num): 5         # none case 6         if num is None: 7             return None 8         # short length case 9         if len(num)==1 :10             return num[0]11         # binary search12         start = 013         end = len(num)-114         while start<=end and num[start]>num[end]:15             mid = (start+end)/216             if num[mid]>num[end]:17                 start = mid+118             else:19                 end = mid20         return num[start]

oj测试通过 Runtime: 57 ms

还是向别人的代码学习来的。

1. 如果是没有rotate的有序数组,那直接就返回最左边的元素就可以了

2. 如果有rotate的情况,情况稍微有些复杂。但是核心点只有一个:rotate前最左边的元素一定是最小的,当然也小于最右边的元素但是rotate后,最左边的元素一定不是最小的了,而且最左边的元素一定大于最右边的元素

搞清楚上面这个思路,问题就变得简单很多(很多if else之类的判断条件就可以省略了)

3. 之前自己写binary search总是爱把start==end(start跟end重叠了) start+1==end(只剩两个元素了)两种case单独拎出来,然后放心大胆地用mid=(start+end)/2再进行后面的判断。这种方法的好处是可以放心大胆,缺点就是代码有时候比较冗长。跟别人的代码学习后,可以用一个条件判断直接省略这两种special cases。

  3.1 num[start]>start[end]就可以保证不出现start==end的情况;且一旦num[start]>num[end]了,就证明当前处理的数组已经逃离rotate的影响了(见2中的红字和蓝字部分),就可以直接返回num[start]了。

  3.2 再考虑start+1==end的case: [2,1]这种情况,mid取start,则num[mid]>num[end],start=mid+1=end,退出while循环,num[start]取到了最小值;如果是[1,2],end=mid=start,同样num[start]取到了最小值。

考虑清楚上述的思路,新一版的简洁代码也就可以敲定了。

转载于:https://www.cnblogs.com/xbf9xbf/p/4261334.html

你可能感兴趣的文章
分布式服务框架原来与实践 读书笔记一
查看>>
Aho-Corasick automation-KMP
查看>>
【http】post和get请求的区别
查看>>
/etc/profile
查看>>
摘记总结(1)
查看>>
TFS强制撤销某个工作区的文件签出记录
查看>>
编写who命令
查看>>
2.1 sikuli 中编程运行
查看>>
愚公移山第一章伪代码
查看>>
常见的位运算技巧总结(膜wys)
查看>>
python魔法函数(二)之__getitem__、__len__、__iter__
查看>>
EL表达式无法显示Model中的数据
查看>>
Linux应用小技巧
查看>>
考题纠错2
查看>>
ps6-工具的基础使用
查看>>
关于CefSharp.WinForms的学习
查看>>
灵活运用 SQL SERVER FOR XML PATH
查看>>
es 加磁盘扩容
查看>>
linux 参数内核
查看>>
使用Azcopy在Azure上进行HBase的冷热备份还原
查看>>