美文网首页
4.寻找旋转排序数组中的最小值

4.寻找旋转排序数组中的最小值

作者: percykuang | 来源:发表于2019-10-17 19:57 被阅读0次

    题目

    假设按照升序排序的数组在预先未知的某个点上进行了旋转。
    
    ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。
    
    请找出其中最小的元素。
    
    你可以假设数组中不存在重复元素。
    
    示例 1:
    
    输入: [3,4,5,1,2]
    输出: 1
    示例 2:
    
    输入: [4,5,6,7,0,1,2]
    输出: 0
    

    分析

    很显然,如果按照传统的遍历然后求最小值,那么时间复杂度将会是O(n)。按照题目的条件--升序排列,那么很容易想到二分法,二分法的时间复杂度是O(logn)。那么问题来了,对于这道题目,该如何使用二分法呢?

    // 思路
    // step1
    3  4  5  1  2
    i           j
    // step2
    3  4  5  1  2
          i     j
    // step3
    3  4  5  1  2
          i  j
    // step4
    // when abs(i - j) <= 1 the min value is min(arr[i], [j])
    

    code

    function getRotateArrMinValue(arr) {
      if (arr.length <= 1)  return arr
    
      let start = 0
      let end = arr.length - 1
      let mid = undefined
      while (start < end) {
        mid = parseInt((start + end) / 2)
        arr[mid] > arr[end] ? start = mid : end = mid
        
        if (Math.abs(start - end) <= 1) {
          return Math.min(arr[start], arr[end])
        }
      }
    }
    

    相关文章

      网友评论

          本文标题:4.寻找旋转排序数组中的最小值

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