Find Minimum in Rotated Sorted Array II

来源:互联网 发布:mac电脑卸载 编辑:程序博客网 时间:2024/06/07 01:01

leetcode上面刷题时遇到的第一个hard类型,花了很长的时间推导公式,得出结论,最终领悟到题目的精髓之后才知道:要转动脑子呀,搞复杂了!

题目

suppose an array sorted in ascending order is rotated at some pivot unknown to you heforehand.(i.e..,0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2 )Find the minimum element.The array may contain duplicates.  

分析

1.理解题目

题目中array的两部分是整体互换的,假设替换之后的数组为:

[ai,ai+1,ai+2,...,an1,a0,a1,a2,...,ai1]

不管怎么rotate,如果将这个array连接成一个首尾相连的环,相邻元素间的位置不变。如下图所示:
这里写图片描述

  • 开始是0是其实位置,数组为[0,1,2,4,5,6,7]
  • 在元素4位置上进行rotate, 变成[4,5,6,7,0,1,2], 相当于环的起始位置变成了4!
  • 于是这样的rotate操作,其实可以看作是在环上寻找新的起始点

2.设计算法

问题转换成:已知一个array, 如果看作首尾相连的一个环,已知环的起始点,求这个环中的最小数。

分析环的结构可知,除了在 maxmin处减小,其余时候相邻元素之间都是非递减的!

算法1:直接寻找第一次呈现减小趋势的下标,也就是找到maxmin的地方,求出min

算法2:根据环的性质,利用二分法求解:

  • 设置三个指针:start,end,mid
  • [mid,end]:
    nums[mid]>nums[end],start=mid+1
    nums[mid]=nums[end],end,end=1
    nums[mid]<nums[end],end=mid

这里的二分法代码需要好好斟酌,虽然二分法几乎是算法课的第一个算法,但是一次性准确无误的写出其代码还是有些困难,至少对我来说是这样的!

原创粉丝点击