leetcode 【 Find Minimum in Rotated Sorted Array 】python 实现
题目:
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
class Solution:
# @param num, a list of integer
# @return an integer
def findMin(self, num):
# none case
if num is None:
return None
# short lenght case
if len(num)==1 :
return num[0]
# binary search
start = 0
end = len(num)-1
while start<=end :
if start==end :
return num[start]
if start+1==end :
return min(num[start],num[end])
mid = (start+end)/2
if num[mid]>num[start] :
if num[mid]>num[end] :
start = mid
else:
return num[start]
else:
if num[mid]>num[end] :
return num[end]
else:
end = mid
思路:
基本思路还是binary search。
注意修改start或end时的条件:因为mid也有可能是最小值,所以start=mid end=mid,这个跟传统二分查找时start=mid+1以及end=mid-1有所不同。
想明白这些后,代码一次AC。
【续】
自己的上一版代码还是太复杂的;复杂的原因是把binary search的常规套路生搬硬套,没有考虑这道题目要求的是最小值就可以了。
改进后的代码如下:
class Solution:
# @param num, a list of integer
# @return an integer
def findMin(self, num):
# none case
if num is None:
return None
# short length case
if len(num)==1 :
return num[0]
# binary search
start = 0
end = len(num)-1
while start<=end and num[start]>num[end]:
mid = (start+end)/2
if num[mid]>num[end]:
start = mid+1
else:
end = mid
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]取到了最小值。
考虑清楚上述的思路,新一版的简洁代码也就可以敲定了。
leetcode 【 Find Minimum in Rotated Sorted Array 】python 实现的更多相关文章
- [leetcode]Find Minimum in Rotated Sorted Array @ Python
原题地址:https://oj.leetcode.com/problems/find-minimum-in-rotated-sorted-array/ 解题思路:话说leetcode上面的二分查找题目 ...
- Leetcode Find Minimum in Rotated Sorted Array 题解
Leetcode Find Minimum in Rotated Sorted Array 题目大意: 对一个有序数组翻转, 就是随机取前K个数,移动到数组的后面,然后让你找出最小的那个数.注意,K有 ...
- [LeetCode] Find Minimum in Rotated Sorted Array II 寻找旋转有序数组的最小值之二
Follow up for "Find Minimum in Rotated Sorted Array":What if duplicates are allowed? Would ...
- [LeetCode] Find Minimum in Rotated Sorted Array 寻找旋转有序数组的最小值
Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 migh ...
- LeetCode Find Minimum in Rotated Sorted Array II
原题链接在这里:https://leetcode.com/problems/find-minimum-in-rotated-sorted-array-ii/ 题目: Follow up for &qu ...
- LeetCode Find Minimum in Rotated Sorted Array
原题链接在这里:https://leetcode.com/problems/find-minimum-in-rotated-sorted-array/ Method 1 就是找到第一个违反升序的值,就 ...
- Leetcode | Find Minimum in Rotated Sorted Array I && II
Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 migh ...
- LeetCode——Find Minimum in Rotated Sorted Array II
Question Follow up for "Find Minimum in Rotated Sorted Array": What if duplicates are allo ...
- Leetcode Find Minimum in Rotated Sorted Array I and II
Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 migh ...
- LeetCode——Find Minimum in Rotated Sorted Array
Description: Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 ...
随机推荐
- /etc/syslog.conf日志配置文件详解
//将info或更高级别的消息送到/var/log/messages,除了mail以外. //其中*是通配符,代表任何设备:none表示不对任何级别的信息进行记录. *.info;mail.none; ...
- Azure School,让你系统化快速学习人工智能
要说目前最热门的技术,非人工智能莫属了,让计算机程序能够看懂.听懂.读懂.理解我们的世界!想想就激动!! 上至高大上的个人数字化助理,下至P图软件,各种应用都开始增加AI相关的功能,试问又有哪个技术爱 ...
- Python核心编程——多线程threading和队列
线程与进程类似不过他们是在同一个进程下执行的,并共享相同的上下文.可以将他们认为是在一个主进程或“主线程”中运行的迷你进程. 线程包括开始.执行顺序和结束三部分.它有一个指令指针,用于记录当前运行的上 ...
- IDEA 编辑器如何将tabs 分行显示
https://jingyan.baidu.com/article/49ad8bcebd9e7c5834d8faac.html
- 用户在设置密码时,提醒请输入半角字符(vue+element+valid)
要保证callback()只有一个出口 rules:{ newPassword: [{validator:(rule,newPassword,callback)=>{ var all = fal ...
- [VC]strcpy和strncoy的区别
第一种情况:char* p="how are you ?";char name[20]="ABCDEFGHIJKLMNOPQRS"; strcpy(name,p ...
- Python读取图片,并保存为矩阵
from scipy.misc import imread,imshow img = imread('D:test.bmp') print img[:,:,2].shape imshow() 注意im ...
- THinkPHP 5.0 域名路由
ThinkPHP支持完整域名.子域名和IP部署的路由和绑定功能 要启用域名部署路由功能,首先需要开启: 'url_domain_deploy' => true 定义域名部署规则支持两种方式:动态 ...
- Redis学习记录(三)
1.Redis集群的搭建 1.1redis-cluster架构图 架构细节: (1)所有的redis节点批次互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽. (2)节点的fail ...
- Load事件中控件Focus()无效解决办法
原因:Load窗体时,窗体未显示 解决:1.Focus()之前添加this.Show(); 2.在Shown事件中添加Focus()