offer 11 旋转数组的最小数字

旋转数组的最小数字

image.png
实际在考察二分查找的方法算法

知识点

一个不包含重复元素的升序数组在通过旋转以后,能够获得下面可视化的折线图:
image.png数组

  • 通过旋转,最小值右侧的数必定严格小于最小值左侧的数
  • 数组最后一个数为x,则在数组最小值右侧的数必定严格小于x,在数组最小值左侧的数必定严格大于x,前提是不包括重复元素,所以利用这个寻找数组最右侧的值,来用二分法解题
  • 定义左边界为left,右边界为right区间的中点为pivot,最小值确定就在区间内,利用区间的中点值和右侧边界值进行比较,
  • 比右边界值则说明区间的中点值在最小值的右侧,所以咱们能够忽略二分查找区间的右半部分
    image.png
  • 比右边界值则说明区间的中点值在最小值的左侧,所以咱们能够忽略二分查找区间的左半部分
    image.png
    因为数组不包含重复元素,而且只要当前的区间长度不为 11,\it pivotpivot 就不会与 \it highhigh 重合;而若是当前的区间长度为 11,这说明咱们已经能够结束二分查找了。所以不会存在 nums[pivot]=nums[right] 的状况。

题解

image.png
本题是没有重复元素的因此没有考虑元素相同的时候
image.png
return left和right均可以spa

元素重复的数组

image.png
本题里面有重复元素,因此得考虑left和right的值相同的时候
image.png索引

  • 当中间节点和右边界点的值相同的时候,没法判断最小值在中间节点的左侧仍是右侧,也就没法判断改变左边界值仍是右边界值,所以不能随便忽略某一段元素,咱们只能肯定不管右边界点的值是否是最小值,数组中都有一个和他相同的中间节点值,所以就能够忽略右边界点的值,而后对右边界点往左侧移动一个索引,也就是right--,若是仍是和中间节点值同样就继续right--,重复直到右边界点right节点的值和中间节点的值不相同
    image.png
    image.png资源

    题解

    image.png
    return left和right均可以
    可是上面这样right--至关于把相同的元素所有遍历了一遍,若是重复元素不少,那就须要遍历不少遍,耗资源it

    对上面算法进行改进

    image.png
    找到两个相等以后就直接在里面遍历,不出循环了class

    剑指题目解答

    image.png
    image.png

相关文章
相关标签/搜索