题目

Follow up for "Find Minimum in Rotated Sorted Array":
What if duplicates are allowed?

Would this affect the run-time complexity? How and why?

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.

The array may contain duplicates.

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

 class Solution:
# @param num, a list of integer
# @return an integer
def findMin(self, num):
# none case
if num is None :
return None
# only one element case
if len(num)==1 :
return num[0]
# binary search case
start = 0
end = len(num)-1
while start<end and num[start]>=num[end]:
mid = (start+end)/2
if num[start]>num[end]:
if num[mid]>num[end] :
start = mid+1
else:
end = mid
else:
if num[mid]>num[end] :
start = mid+1
else :
start = start+1
return num[start]

思路

对比之前一道题:http://www.cnblogs.com/xbf9xbf/p/4261334.html

这道题需要考虑duplicate的case。

简略地说,跟之前不带duplicate的case相比,核心的区别在:

不带duplicate的case : num[start]>num[end]是铁定成立的

带duplicate的case : num[start]>num[end]不一定是成立的,还可能是num[start]==num[end]

就是多了这么一个等号的可能,所以最直观的办法就是单独把这种等号的情况拿出来嘛。

因此需要讨论的情况一共有两种:

1. num[start]>num[end]

2. num[start]==num[end]

有人可能要问,为啥不能有num[start]<num[end]的情况?答:因为在while循环终止条件中已经限定了num[start]>=num[end];如果真有num[start]<num[end]的情况,那么当前start到end位置的数组已经是有序的了,直接return[start]就OK了。

Tips:

在AC之前还遇上几个问题:

1. 如果出现无法判断最小值是在左半边还是右半边的时候,不要同时start=start+1 end=end-1,start=start+1即可,否则会指针溢出

2. 之前在while循环条件的时候,一直写的是start<=end。就是多了这么一个等号,submit了几次一直不能AC。究其原因,如果start==end,就会导致执行start=start+1语句,不是溢出就是错。如果修改一下while循环的条件,start<end,那么当start==end的时候自动就退出循环了,并且返回num[start]了。

最新文章

  1. 【前端】CoffeeScript
  2. Cloud9:解决ThinkPHP在C9上运行时连接数据库时报错&quot;No such file or directory&quot;的问题
  3. BZOJ3414 : Poi2013 Inspector
  4. linq查询结果datetime类型转string类型
  5. mac 免密码登陆服务器
  6. 记录Cat类的个体数目
  7. request.getParameter与request.getAttribute()
  8. AndroidManifest.xml 屏幕上下反转
  9. 成功完成Moses Manual中BaseLineSystem
  10. 在线最优化求解(Online Optimization)之一:预备篇
  11. Nginx端口的修改
  12. openCV学习笔记
  13. 不需要软件让Windows7变身WIFI热点
  14. BZOJ 1221: [HNOI2001] 软件开发(最小费用最大流)
  15. Objective-C中经常使用的结构体NSRange,NSPoint,NSSize(CGSize),NSRect
  16. C#-TextBox-登录表单password无形---ShinePans
  17. RedHat7下PostGIS源码安装
  18. 使用FastJson进行对象和JSON转换属性命名规则为下划线和驼峰的问题
  19. win7查看其它工作组 win7 所有工作组
  20. LinkedIn文本分析平台:主题挖掘的四大技术步骤

热门文章

  1. iOS .Crash文件分析处理办法 (利用symbolicatecrash工具处理)
  2. Payoneer个人账户注册申请教程
  3. docker制作共享jdk的tomcat镜像
  4. hihocoder 1080 线段树(区间更新)
  5. 访问mongo数据库报错
  6. CentOS6.5下载地址
  7. CentOS系统下安装Redis
  8. 说说qwerty、dvorak、colemak三种键盘布局
  9. 人脸验证算法Joint Bayesian详解及实现(Python版)
  10. Linux入门-第七周