旋转数组的最小值

1 基本思路:旋转数组的特点:旋转数组只有在旋转的接口处(旋转前数组的最后一个元素和旋转前数组的第一个元素拼接的地方)会出现下降,其余大部分都是非递减的。利用这个特点,只要找到旋转数组中第一个比前一个元素小的元素,该元素就是旋转前数组的第一个元素,因为旋转前数组时非递减的,所以该元素即为数组中最小元素。这是一般情况。
还需要考虑两个特殊情况:第一个是比较常规的特殊情况,就是数组长度为0的时候,返回值为0;第二个是由于旋转前数组时非递减的,所以数组中的元素可能全部相等,此时返回数组中任意一个元素即可。
2 具体代码

class Solution {
public:
    int minNumberInRotateArray(vector<int> rotateArray) {
        //如果旋转数组长度为0
        if(rotateArray.size()==0)
            return 0;
        
        //如果旋转数组中的元素全相等,返回数组任意一个元素即可
        bool isAllEqual=true;
        for(int i=0;i<rotateArray.size()-1;i++)
        {
         if(rotateArray[i]!=rotateArray[i+1])
         {
              isAllEqual=false;
              break;
         }
        }
         if(isAllEqual)
             return rotateArray[0];
         //如果旋转数组中的元素不全相等,返回第一个比前一个元素小的元素即可
        for(int i=0;i<rotateArray.size()-1;i++)
        {
            if(rotateArray[i+1]<rotateArray[i])
                 return rotateArray[i+1];
        }
    }
};

报错:
在这里插入图片描述
原因:有些编译器因为所有的返回值都在条件语句中,所以报错。调整一下程序结构,使得至少一个返回值不在条件语句中。
调整代码:

class Solution {
public:
    int minNumberInRotateArray(vector<int> rotateArray) {
        //如果旋转数组长度为0
        if(rotateArray.size()!=0)
        {
        //如果旋转数组中的元素全相等,返回数组任意一个元素即可
        bool isAllEqual=true;
        for(int i=0;i<rotateArray.size()-1;i++)
        {
         if(rotateArray[i]!=rotateArray[i+1])
         {
              isAllEqual=false;
              break;
         }
        }
         if(isAllEqual)
             return rotateArray[0];
         //如果旋转数组中的元素不全相等,返回第一个比前一个元素小的元素即可
        for(int i=0;i<rotateArray.size()-1;i++)
        {
            if(rotateArray[i+1]<rotateArray[i])
                 return rotateArray[i+1];
        }
    }
        return 0;
    }
};

运行正确。
补充说明:这里有一种特殊情况,应为处理方式相同,所有隐藏在了代码里面,但是不代表不需要考虑。
看到程序中的for循环中i的取值是从0到rotateArray.size()-1,左闭右开。当rotateArray.size()==1时(即rotateArray中只有一个元素),这个循环会一次都不执行。由于用于判断数组中全部元素相等的标志变量isAllEqual默认为true,因为没有执行循环,isAllEqual最终仍为true,这和实际情况中的结果是一致的:即数组只有一个元素时,数组中全部元素相等,所以这种特殊情况可以归在普通情况的代码中。

3 收获:
一般报错 control may reach end of non-void function是因为函数的所有返回值均在条件语句中,这时候只需要调整一个return语句不在条件语句中,既可编译通过。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值