剑指offer:旋转数组的最小数字
题目描述:
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
解题思路:
最直观的想法就是遍历一遍数组,找到最小值,但这样明显没有用到旋转数组这个信息。
由于这个旋转的操作实际上是将原数组划分成了两个有序的数组,第一个数组是大于第二个数组的,所以考虑用二分的思想。设定两个指针,指针p1指向第一个递增数组,指针p2指向第二个递增数组,两个指针的中间值mid和对应两个指针所指向的值对比,若mid比p1所值元素大,则说明最小元素在后半段,此时p1移动到mid位置,数组长度减半;若mid比p2所值元素小,则说明最小元素在前半段,此时p2移到mid位置。这样到最后,p1和p2就相临,其中p1指向第一个递增数组的最后一位,p2指向第二个递增数组的第一位,即最小值为p2所值元素。
需要注意以下两个特殊情况:
1. 若原数组没有旋转,那么第一个元素即为最小值;
2. 若左右指针所指元素和中间元素都相等,此时就无法决定指针要如何移动,即无法确定最小元素在前半段还是后半段。此时只能通过顺序查找最小元素。
时间复杂度为O(logn),最坏情况下为O(n)。
代码:
class Solution {
public:
int minNumberInRotateArray(vector<int> rotateArray)
{
if(rotateArray.empty())
{
return ;
}
int left=;
int right=rotateArray.size()-;
if(rotateArray[left]<rotateArray[right])
{
return rotateArray[left];
}
int mid = left;
while(right>left)
{
mid=(right+left)/;
int middle=rotateArray[mid];
int leftNumber=rotateArray[left];
int rightNumber=rotateArray[right];
if((right-left)==)
{
return rightNumber;
}
//左中右的值全都相等,不能确定在前还是在后,只能遍历查后一个比前一个小就是最小值
if(middle==leftNumber&&middle==rightNumber)
{
for(int i=left;i<right;i++)
{
if(rotateArray[i]>rotateArray[i+])
{
return rotateArray[i+];
}
}
//全相等的话直接返回最左值就行了
return leftNumber;
}
else if(middle<leftNumber)
{
right=mid;
}
else if(middle>rightNumber)
{
left=mid;
}
}
return rotateArray[mid];
}
};
剑指offer:旋转数组的最小数字的更多相关文章
- 剑指Offer 旋转数组的最小数字
题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转 ...
- 剑指Offer——旋转数组的最小数字
题目描述: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一 ...
- 用js刷剑指offer(旋转数组的最小数字)
题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个 ...
- 剑指Offer_11_旋转数组的最小数字
题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出一个旋转数组的最小元素. 例如: {3,4,5,1,2} 为 {1,2,3,4,5} ...
- 剑指offer-7.旋转数组的最小数字
看起来不需要用二分法查找 --------------------------------------------------------- 时间限制:3秒 空间限制:32768K 热度指数:5098 ...
- 剑指Offer-6.旋转数组的最小数字(C++/Java)
题目: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转, ...
- 剑指offer6:旋转数组的最小数字
1. 题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一 ...
- 剑指offer8 旋转数组的最小数字
一种错误写法: class Solution { public: int minNumberInRotateArray(vector<int> rotateArray) { int len ...
- 剑指offer-旋转数组的最小数字06
题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋 ...
- 剑指offer-旋转数组的最小数字-数组-python
题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转 ...
随机推荐
- rpm-yum_install_software
rpm -ivh software_name安装软件 打印详情rpm -q software_name查询软件是否安装rpm -ql software_name查询安装目录rpm -e softwar ...
- js 固定表头及固定列的js
//给table 外层加一个div然后将divid传入方法,arr是一个数组里面填写需要固定的列数function fixedCol(arr,divId){ var colArr = arr || [ ...
- 关于"为什么说Arduino是玩具?"的回答
最开始从51入门.之后MSP.ARM.FriendARM等等和使用keil(MDK).iar等工具.之后Arduino.Raspberry Pi的人想说: "说'Arduino是玩具,和Ar ...
- 第八天- 基础数据操作补充 集合set 深浅拷贝
字符串的操作补充: .join() 方法用于将序列(字符串/列表/元组/字典)中的 元素 以指定的字符连接生成一个新的字符串 str = "人生苦短我用python!" # 用于字 ...
- PTA-括号问题
括号问题 作者: 李廷元 单位: 中国民用航空飞行学院 时间限制: 400 ms 内存限制: 64 MB 代码长度限制: 16 KB 问题描述 给定一串字符,不超过100个字符,可能包括括号.数字.字 ...
- flex学习园地
http://blog.sina.com.cn/s/blog_6d0dc2a901013enk.html
- python基础学习1-日志信息
#!/usr/bin/env python # -*- coding:utf-8 -*- 日志 import logging # 5个级别的日志 DEBUG INFO WARNING ERROR ...
- 9.13 开课第十天(JS脚本语音:语句:循环)
循环:循环操作某一个功能(执行某段代码) 四要素: 循环初始值 循环条件 状态改变 循环体 for 穷举 迭代 while(true) break //先执行 ...
- Python day2 ---python基础2
本节内容 列表. 元组操作 购物车程序 字符串操作 字典操作 3级菜单 作业(购物车优化) 1. 列表操作 1.定义列表names = ['Alex',"Tenglan",'Eri ...
- 【TJOI2015】线性代数
题面 题解 要求的是 \[ \sum_{i=1}^n\sum_{j=1}^na_ia_jb_{i,j} - \sum_{i=1}^na_ic_i \] 可以看出这是一个最大权闭合子图问题 代码 #in ...