题目描述:
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小数组。例如数组{3,4,5,1,2}是数组{1,2,3,4,5}的旋转数组,该数组的最小值为1。
思路解析:
O(N)的算法
这种算法的思想就是遍历这个数组,由于这个数组是两部分有序的数组,因此遍历这个数组时当后一个数字小于前一个数字时,则后一个(即较小)一定为整个数组中最小的数字。
这种算法的思想很简单,但就是时间复杂度较大,因此不是很好的算法。
?
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
int minNumberInRotateArray(vector<int> rotateArray)
{
if (rotateArray.empty())
return -1;
unsigned int i=0;
for (; i<rotateArray.size()-1; i++)
{
if (rotateArray[i] > rotateArray[i+1])
break;
}
return rotateArray[i+1];
}
|
O(logN)的算法
这种算法思想类似于二分查找,首先每次找到数组中中间的数字mid,如果mid大于最左端left,说明最小数在mid的右侧区间,则改变left,置left为mid;如果mid小于数组右侧right,说明最小数在mid的左侧区间,则改变right为mid….当left的数字小于等于right的数字时,说明已经找到最小数,这个也是循环结束的条件
?
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
int minNumberInRotateArray(vector<int> rotateArray)
{
if (rotateArray.empty())
return -1;
unsigned int left=0;
unsigned int right=rotateArray.size()-1;
unsigned int mid=left;
while (rotateArray[left] >= rotateArray[right])
{
if (right-left == 1)
{
mid = right;
break;
}
mid = left+((right-left)>>1);
if (rotateArray[mid]==rotateArray[left] && rotateArray[right]==rotateArray[mid])
return rotateArray[mid];
if (rotateArray[mid] >= rotateArray[left])
left = mid;
else if (rotateArray[mid] <= rotateArray[right])
right = mid;
}
return rotateArray[mid];
}
|
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
相关文章
猜你喜欢
- ASP.NET自助建站系统中如何实现多语言支持? 2025-06-10
- 64M VPS建站:如何选择最适合的网站建设平台? 2025-06-10
- ASP.NET本地开发时常见的配置错误及解决方法? 2025-06-10
- ASP.NET自助建站系统的数据库备份与恢复操作指南 2025-06-10
- 个人网站服务器域名解析设置指南:从购买到绑定全流程 2025-06-10
TA的动态
- 2025-07-10 怎样使用阿里云的安全工具进行服务器漏洞扫描和修复?
- 2025-07-10 怎样使用命令行工具优化Linux云服务器的Ping性能?
- 2025-07-10 怎样使用Xshell连接华为云服务器,实现高效远程管理?
- 2025-07-10 怎样利用云服务器D盘搭建稳定、高效的网站托管环境?
- 2025-07-10 怎样使用阿里云的安全组功能来增强服务器防火墙的安全性?
快网idc优惠网
QQ交流群
您的支持,是我们最大的动力!
热门文章
-
2025-06-04 95
-
2025-05-26 83
-
2025-06-04 88
-
2025-05-25 37
-
2025-05-29 100
热门评论


