Find Minimum in Rotated Sorted Array && Find Minimum in Rotated Sorted Array II

Find Minimum in Rotated Sorted Array


我的思路:

1、在一个旋转数组中找到最小的那个数,只需要找到旋转的那个点就可以了。特殊情况没有旋转或者说旋转点在-1这个下标,返回num[0],如果只有一个数也返回num[0]。

2、由于没有重复的数,设定两个下标,从两头往中间找。当左边的值比右边小的时候停止循环。

3、如果begin == end,说明是奇数个数,我们要判断最中间的数是最大还是最小;如果不等于,说明是偶数个数或者已经错过,只需判断num[end]是在最大的 数还是最小的数。这里说得不清楚,应该有更好的判断方法。


代码如下:

    int findMin(vector<int> &num) {
        if (num[0] <= num[num.size() - 1])
            return num[0];
        int begin = 0, end = num.size() -1;
        while (num[begin] > num[end]) {
            begin++;
            end--;
        }
        return num[(begin == end ? (num[begin - 1] < num[begin] ? begin : begin - 1) : (num[end] > num[end + 1] ? end : begin - 1)) + 1];
    }


别人思路:

1、二分明显是可以的,下面代码来自leetcode讨论区

int findMin(vector<int> &num) {
        int lo = 0, hi = num.size() - 1;
        while(lo < hi){
              int mid = (lo + hi) / 2;
              if (num[mid] > num[hi]) 
                lo = mid + 1;
              else 
                hi = mid;
        }
        return num[lo];
    }

Find Minimum in Rotated Sorted Array II

1、这题是Search in Rotated Sorted Array的基础题。只要找出最小的数就可以了。

2、对比第一个版本,改变了移动指针的方法。

我的代码:

    int findMin(vector<int> &num) {
        if (num.size() == 1) 
            return num[0];
        
        int begin = 0, end = num.size() - 1;
        while (num[begin] <= num[begin + 1] && num[end] >= num[end - 1] && end > 0) {
            begin++;
            end--;
        }
        int mid = end == 0 ? 0 : num[begin] > num[begin + 1] ? begin + 1 : end; 
        return num[mid];
    }

别人思路:

1、依旧是可以利用二分查找的方法来做。

2、如果遇到num[mid]和num[end]一样的时候,不确定是在左边还是在右边,我们让end--。

代码如下:

    int findMin(vector<int> &num) {
        int begin = 0, end = num.size() - 1;
        int mid = (begin + end) / 2;
        while (begin < end) {
            if (num[mid] > num[end])
                begin = mid + 1;
            else if (num[mid] < num[end])
    			end = mid;
    		else
    		    end--;
    		mid = (begin + end) / 2;
        }
        return num[mid];
    }

有些时候问题出现新的情况的时候要考虑使用新的方法去解决,不能套用老方法。



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值