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语句不在条件语句中,既可编译通过。