Find Minimum in Rotated Sorted Array II

这道题目几乎没有什么好的解法。而leetcode的统计显示有接近0秒的解法,我不得而知。

我试了最基本的O(N)解法,与写得较好的二分法,在leetcode上甚至O(n)的解法更快。

AC不是唯一目的,这道题如果在面试中考察的应该是如何解决因重复而导致的退化问题。

其实要把问题想的简单一些,当发现首尾元素相同而无法二分时简单的采用线性办法就好了。

分享一个我觉得写得简单而优美的二分法(https://oj.leetcode.com/discuss/13800/my-c-solution-24ms-is-there-any-better-solution)

class Solution {
public:
int findMin(vector<int> &num) {
    int start = 0;
    int end = num.size()-1;
    int mid;
    while(start<end){
        if(num[start]<num[end])   //if the remained array are sorted ,just break to return the first element.
        break;
        mid = (end+start)/2;
        if(num[mid]>num[end]){    //mid is bigger, so it's useless. Just go forward
            start = mid+1;
        }
        else if(num[mid]==num[end]){//special case! we know end <=start, so just erase the duplicated!
            start++;
            end--;
        }
        else                 //mid <end, Is mid < min < end possible? e.g. 1 1 1 0 1(mid) 1 2
        end= mid;            //as shown above,this never happen!
    }
    return num[start];
 }
};

This solution is beautiful !

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值