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

本文介绍了一种在旋转数组中查找最小元素的高效算法。旋转数组由非递减排序数组旋转形成,文章提供了两种方法:遍历数组找到最小值和利用数组特性在O(n)时间内确定最小值位置。代码示例采用C++实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;	
}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值