美文网首页
153and154、 查找旋转有序数组中的最小值

153and154、 查找旋转有序数组中的最小值

作者: 小碧小琳 | 来源:发表于2018-08-03 00:03 被阅读0次

一、解题思路:

1、如果直接用遍历,数组在一定意义上是有序的,所以一开始就直接遍历不是最好的选择,考虑用二分法将复杂度降为O(logn)
2、用二分查找,就涉及到left,right,mid之间的操作了。这时候,就多写出几个不同的例子,分一下情况,尤其重要的是,一定要把下一次循环的指针赋值写对了。
为此,在写完代码以后要自己测试一下。

3、从一般到特殊——功能测试
根据写出来的几个一般的例子,我们可以认为,最左边的元素一定大于最右边的元素。

二、代码思路

每次循环时,因为left或right也在变,因此mid也要改变:mid等于left+right的和再整除2,注意除号是反斜杠。

循环中操作

选择中间item进行下一步的比较操作

  • 若中间元素大于最左边的元素,那么说明左半部分都是比较大的元素,
    最小的元素在右半部分,因此应该把mid赋值给left,下次在新的left到right区间进行查找。
  • 同理于中间元素小于最右边元素的情况。

循环终止条件

  • 设置左右指针left与right,根据上述两种情况,编写循环
  • 考虑最后边界的情况,当左右指针靠近(右指针比左指针大1)的时候
    因为右边才是最小部分,所以最小值就在右边

三、代码测试

功能测试(数组中不含相同元素):

  • 输入一般的旋转排序数组
  • 输入旋转0个元素的数组(也就是未旋转的数组)
    此时我们发现再去比较中间的并不适用了,可以直接返回数组的第一个元素。

边界测试:

  • 数组为空
  • 数组只含一个

特殊情况数组

若是mid,left,right三个位置的元素都相等,那我们没有办法确定最小元素在哪一半。此时,只能采取顺序查找了。因此,可以专门写一个顺序查找的函数。

代码实现:

class Solution:
    def findMin(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """

        # 定义一个顺序查找的函数
        def minOrder(nums):
            min_num = nums[0]
            for i in nums:
                if i < min_num:
                    min_num = i
            return min_num
        
        if nums:
            if len(nums) == 1:
                return nums[0]
            left = 0
            right = len(nums) - 1
            #除号是反斜杠,一定要注意
            mid = len(nums) // 2
            #没有元素旋转的情况
            if nums[right] > nums[left]:
                return nums[0]
            #三个指针元素都相等的情况
            if nums[mid] == nums[left] and nums[mid] == nums[right]:
                minOrder(nums)
            
            #一般情况
            while right - left > 1:
                mid = (right + left) // 2
                if nums[mid] > nums[left]:
                    print(nums[mid:right+1])
                    left = mid
                else:
                    print(nums[left:mid])
                    right = mid
            return nums[right]
        else:
            return None
        
Solution = Solution()
print(Solution.findMin([0,1,2,4,5,6,7,8,9,10]))

相关文章

  • 153and154、 查找旋转有序数组中的最小值

    一、解题思路: 1、如果直接用遍历,数组在一定意义上是有序的,所以一开始就直接遍历不是最好的选择,考虑用二分法将复...

  • 旋转数组的最小值

    旋转数组的最小值 所谓旋转数组,即是递增有序数组旋转右移动若干位得到的数组,这里的右移和java里的>>>有点不同...

  • 二分法查找

    1,二分法查找,插入元素位置 2,数组旋转,求最小值问题 参考 旋转数组的最小元素

  • C语言折半查找

    折半查找 折半查找的注意点折半查找只能查找有序数组的值 折半查找的逻辑1.把数组第一个元素的索引作为最小值,最后一...

  • 数组的应用--最值问题

    查找数组中的最大值、最小值: 打印结果:

  • [剑指offer]08-旋转数组的最小数字

    旋转数组的最小数字 题目 给定一个递增的旋转数组A,返回旋转数组中的最小值。旋转数组:给定一个已排序的数组,假设为...

  • JS数组的二分查找算法

    用途:对有序数组进行查找。如:查找指定元素在数组中的下标

  • 算法题

    行列都是有序的二维数组,查找k是否存在【查找法】 二维数组中的查找(行列分别有序数组的二分查找)【递归法】 快速排...

  • 6_4循环有序数组最小值

    对于一个有序循环数组arr,返回arr中的最小值。有序循环数组是指,有序数组左边任意长度的部分放到右边去,右边的部...

  • 查找旋转数组的最小值

    声明: 本总结仅为个人学习总结,以防止遗忘而作,不得转载和商用。 问题描述假定一个排序数组(已经有序) 以某个未知...

网友评论

      本文标题:153and154、 查找旋转有序数组中的最小值

      本文链接:https://www.haomeiwen.com/subject/msyevftx.html