153和154. Find Minimum in Rotated Sorted Array II

先来看154

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.

题目把已排好的序列移位了一下,然后让找最小值。

so,如果直接找最小值,复杂度是O(n)

class Solution(object):
    def findMin(self, nums):
        return min(nums)

显然,我们的目标是寻找更好的算法,显然第一个考虑的是二分查找。

我代码的要点:
- 第10行,每一次迭代都判断一下是否是排好序的,排好序的话就无需递归了
- 第16、17行,存在着相等的情况怎么处理,如【3,1,3,3,3】这里,先把第一个3去掉【1,3,3,3】就是排好序的了,输出第一个;再比如【3,3,3,1,3】,这里还是先去前面的3变成[3, 3, 1, 3],[3, 1, 3]到这里进入第14行,[3, 1]输出1

但是,写完一看由于存在可能重复的数,所以16、17行的存在,使得复杂度是O(n)的,即最差的情况是:所有的数都是一样的。

class Solution(object):
    def findMin(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        high=len(nums)-1
        low=0
        while low<high:
             if nums[low] < nums[high]:break
             mid = (high + low)// 2
             if nums[mid]>nums[low]:
                  low=mid+1
             elif nums[mid]<nums[high]:
                high=mid
             elif nums[mid]==nums[low]:low+=1
             else:high-=1
        return nums[low]

做完这个再回看153,这里数是不允许重复的,我把处理可能的重复的两行注释掉,再加上一行 low=mid的情况(即只有两个数的情况即可)

class Solution(object):
    def findMin(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        high=len(nums)-1
        low=0
        while low<high:
             if nums[low] < nums[high]:break
             mid = (high + low) // 2
             if mid==low:return nums[high]
             if nums[mid]>nums[low]:
                  low=mid+1
             elif nums[mid]<nums[high]:
                high=mid
             #elif nums[mid]==nums[low]:low+=1
             #else:high-=1
        return nums[low]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值