zoukankan      html  css  js  c++  java
  • 牛客网 剑指offer-JZ6 旋转数组的最小数字

    题目描述:

    把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
    输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
    NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。

    解题思路:

    其实可以直接返回数组种的最小值,但是这样子题目就失去了意义。

    题目中说的是非递减排序的数组,所以相当于,本身是有序的,有序数组的查找比较容易想到二分查找,刚好,旋转之后,以旋转的点为节点分开的话,左右两部分仍然是有序的。

    所以就有以下几种情况:

    这种二分查找难就难在,arr[mid]跟谁比.
    我们的目的是:当进行一次比较时,一定能够确定答案在mid的某一侧。一次比较为 arr[mid]跟谁比的问题。
    一般的比较原则有:

    • 如果有目标值target,那么直接让arr[mid] 和 target 比较即可。
    • 如果没有目标值,一般可以考虑 端点

    这里我们把target 看作是右端点,来进行分析,那就要分析以下三种情况,看是否可以达到上述的目标。

    1. 情况1,arr[mid] > target:4 5 6 1 2 3
      • arr[mid] 为 6, target为右端点 3, arr[mid] > target, 说明[first ... mid] 都是 >= target 的,因为原始数组是非递减,所以可以确定答案为 [mid+1...last]区间,所以 first = mid + 1
    2. 情况2,arr[mid] < target:5 6 1 2 3 4
      • arr[mid] 为 1, target为右端点 4, arr[mid] < target, 说明答案肯定不在[mid+1...last],但是arr[mid] 有可能是答案,所以答案在[first, mid]区间,所以last = mid;
    3. 情况3,arr[mid] == target:
      • 如果是 1 0 1 1 1, arr[mid] = target = 1, 显然答案在左边
      • 如果是 1 1 1 0 1, arr[mid] = target = 1, 显然答案在右边
        所以这种情况,不能确定答案在左边还是右边,那么就让last = last - 1;慢慢缩少区间,同时也不会错过答案。最后只剩下一个元素的时候,就是所求值。这道题最大的难点就是在这个地方该怎么考虑!
      • # -*- coding:utf-8 -*-
        class Solution:
            def minNumberInRotateArray(self, rotateArray):
                mid = left = right = 0
                right = len(rotateArray)-1
                if (len(rotateArray) == 0):
                    return 0
                while(left < right):
                    mid = (right + left ) >> 1
                    if ( rotateArray[mid] > rotateArray[right] ):
                        left = mid + 1
                    elif ( rotateArray[mid] < rotateArray[right] ):
                        right = mid
                    else : 
                        right = right-1
                return rotateArray[left]
                # write code here
      • 时间复杂度:二分,所以为O(longN), 但是如果是[1, 1, 1, 1],会退化到O(n)
        空间复杂度:没有开辟额外空间,为O(1)

  • 相关阅读:
    printcap
    browser-ua
    PHP 开发 APP 接口 学习笔记与总结
    Java实现 LeetCode 72 编辑距离
    Java实现 LeetCode 72 编辑距离
    Java实现 LeetCode 72 编辑距离
    Java实现 LeetCode 71 简化路径
    Java实现 LeetCode 71 简化路径
    Java实现 LeetCode 71 简化路径
    Java实现 LeetCode70 爬楼梯
  • 原文地址:https://www.cnblogs.com/upstart/p/15037475.html
Copyright © 2011-2022 走看看