旋转数组的最小数字
实际在考察二分查找的方法
知识点
一个不包含重复元素的升序数组在经过旋转之后,可以得到下面可视化的折线图:
- 经过旋转,最小值右侧的数一定严格小于最小值左侧的数
- 数组最后一个数为x,则在数组最小值右侧的数一定严格小于x,在数组最小值左侧的数一定严格大于x,前提是不包括重复元素,因此利用这个寻找数组最右侧的值,来用二分法解题
- 定义左边界为left,右边界为right区间的中点为pivot,最小值肯定就在区间内,利用区间的中点值和右侧边界值进行比较,
- 比右边界值小则说明区间的中点值在最小值的右侧,因此我们可以忽略二分查找区间的右半部分
- 比右边界值大则说明区间的中点值在最小值的左侧,因此我们可以忽略二分查找区间的左半部分
由于数组不包含重复元素,并且只要当前的区间长度不为 11,\it pivotpivot 就不会与 \it highhigh 重合;而如果当前的区间长度为 11,这说明我们已经可以结束二分查找了。因此不会存在 nums[pivot]=nums[right] 的情况。
题解
本题是没有重复元素的所以没有考虑元素相同的时候
return left和right都可以
元素重复的数组
本题里面有重复元素,所以得考虑left和right的值相同的时候
当中间节点和右边界点的值相同的时候,无法判断最小值在中间节点的左侧还是右侧,也就无法判断改变左边界值还是右边界值,因此不能随便忽略某一段元素,我们只能确定无论右边界点的值是不是最小值,数组中都有一个和他相同的中间节点值,因此就可以忽略右边界点的值,然后对右边界点往左侧移动一个索引,也就是right--,如果还是和中间节点值一样就继续right--,重复直到右边界点right节点的值和中间节点的值不相同
题解
return left和right都可以
但是上面这样right--相当于把相同的元素全部遍历了一遍,如果重复元素很多,那就需要遍历很多遍,耗资源对上面算法进行改进
找到两个相等之后就直接在里面遍历,不出循环了剑指题目解答
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。