[剑指Offer]笔记6.旋转数组的最小数字 C++实现

Problem Description

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。

Mentality

最简单的办法,就是遍历整个数组,找出最小值。

改进一下算法,由于原数组是非递减的,也就是递增的,经过旋转之后,就形成了两个递增序列,最小值就在两个递增序列中间处,只要找出不递增的位置,就找到了最小值。若找不到该位置,说明是把原数组整个旋转了,即开头就是最小值。

Code (C++)

方法一(使用函数和迭代器)

class Solution {
public:
    int minNumberInRotateArray(vector<int> rotateArray) {
        if(rotateArray.empty())//若数组为空即大小为0 
        	return 0;//返回0 
		
		int re=*(rotateArray.begin());
		for(auto it=rotateArray.begin(); it!=rotateArray.end(); it++)
			if(*it<re)
				re = *it;
		return re; 
    }
};

方法一(不使用迭代器)

class Solution {
public:
    int minNumberInRotateArray(vector<int> rotateArray) {
        int len=rotateArray.size();
		if(len==0)//若数组为空即大小为0 
        	return 0;//返回0 
		
		int re=rotateArray[0];
		for(int i=1;i<len;i++)
			if(rotateArray[i]<re)
				re = rotateArray[i];
		return re; 
    }
};

方法二:

class Solution {
public:
    int minNumberInRotateArray(vector<int> rotateArray) {
        int len=rotateArray.size();
		if(len==0)//若数组为空即大小为0 
        	return 0;//返回0 
		
		for(int i=0; i<len-1; i++)
			if(rotateArray[i]>rotateArray[i+1])
				return rotateArray[i+1];
				
		return rotateArray[0];
    }
};

本地测试代码:

#include<iostream> 
#include<vector>
using namespace std;
int main(){
	Solution s;
	vector<int> test1={3,4,5,1,2};
	vector<int> test2={1,2,3,4,5};
	cout<<s.minNumberInRotateArray(test1)<<endl;
	cout<<s.minNumberInRotateArray(test2);
	return 0;	
}

运行结果如图:
在这里插入图片描述
已通过所有的测试用例,欢迎指正批评(´▽`ʃ♡ƪ)

发布了19 篇原创文章 · 获赞 10 · 访问量 1201

猜你喜欢

转载自blog.csdn.net/qq_38655181/article/details/105357536