题目:

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。

输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。

例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。

思路:

1、遍历数组,找到数组的最小值,时间复杂度O(n);

2、二分查找,时间复杂度O(logn)

注意旋转数组的循环不变量,A[left]>=A[right](这道题的数组为非递减数组,并非严格的递增数组)

特例:无旋转情况以及{0,1,1,1,1,1}旋转数组

查找过程:

旋转数组可以看成两个递增(非减)数组,通过前后两个指针left,right分别指向数组的首尾,

当满足循环不变量时A[left]>=A[right],mid=(left+right)/2,

如果A[mid]>=A[left],说明最小值存在mid后面部分,left=mid;

如果A[mid]<=A[left],说明最小值存在mid前面部分,right=mid;

经过循环之后,最终left会指向第一个递增数组的最后一个数,right会指向第二个递增数组的第一个数,即最小值mid=right。

最终return A[mid];

解决特例问题:

  • 无旋转数组:数组就是递增的,返回第一个数,即A[left],因此mid=left即可;
  • {0,1,1,1,1,1}类似旋转数组:不满足上述查找过程,只能遍历数组。

代码:

#include <iostream>
#include <vector> using namespace std; int MinInOrder(int* arr,int left,int right){
int result=arr[left];
for(int i=left+1;i<=right;i++){
if(result>arr[i])
result=arr[i];
}
return result;
} int Min(int* numbers,int length){
if(numbers==NULL || length<=0)
return -1;
int left=0;
int right=length-1;
int mid=left;
while(numbers[left]>=numbers[right]){
if(right-left==1){
mid=right;
break;
}
mid=left+((right-left)>>1);
if(numbers[left]==numbers[right] && numbers[left]==numbers[mid])
return MinInOrder(numbers,left,right);
if(numbers[mid]>=numbers[left])
left=mid;
else
right=mid;
}
return numbers[mid];
} int main()
{
int A[]={1,0,1,1,1,1,1,1};
int len=sizeof(A)/sizeof(A[0]);
Solution s;
vector<int> nums(A,A+len);
cout<<s.minNumberInRotateArray(nums)<<endl;
cout<<Min(A,len)<<endl;
return 0;
}

在线测试OJ:

http://www.nowcoder.com/books/coding-interviews/9f3231a991af4f55b95579b44b7a01ba?rp=1

AC代码:

class Solution {
public:
int minNumberInRotateArray(vector<int> rotateArray) {
int len=rotateArray.size();
if(len==0)
return 0;
int left=0;
int right=len-1;
int mid=left;
//if(rotateArray[left]<rotateArray[right]);
// return rotateArray[left];
while(rotateArray[left]>=rotateArray[right]){
if(right-left==1){
mid=right;
break;
}
mid=left+((right-left)>>1);
if(rotateArray[left]==rotateArray[right] && rotateArray[left]==rotateArray[mid])
return MinInOrder(rotateArray,left,right);
if(rotateArray[mid]>=rotateArray[left])
left=mid;
else
right=mid;
}
return rotateArray[mid];
} int MinInOrder(const vector<int> &arr,int left,int right){
int result=arr[left];
for(int i=left+1;i<=right;i++){
if(result>arr[i])
result=arr[i];
}
return result;
}
};

  

(剑指Offer)面试题8:旋转数组的最小数字的更多相关文章

  1. 剑指Offer - 九度1386 - 旋转数组的最小数字

    剑指Offer - 九度1386 - 旋转数组的最小数字2013-11-24 01:57 题目描述: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转 ...

  2. 剑指offer【06】- 旋转数组的最小数字(java)

    题目:旋转数组的最小数字 考点:查找和排序 题目描述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4, ...

  3. 《剑指Offer》算法题——“旋转数组”的最小数字

    题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个非递减序列的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数 ...

  4. 剑指offer六之求旋转数组的最小数字

    一.题目 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个 ...

  5. 【剑指Offer】6、旋转数组的最小数字

      题目描述:   把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5 ...

  6. 剑指Offer:面试题8——旋转数组的最小值(java实现)

    题目描述: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入 一个递增排序的数组的一个旋转 输出 旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的 ...

  7. 剑指Offer:面试题33——把数组排成最小的数(java实现)(未完待续)

    问题描述: 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323. 思路1: ...

  8. 【剑指offer】面试题 11. 旋转数组的最小数字

    面试题 11. 旋转数组的最小数字 题目描述 题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4, ...

  9. Leetcode - 剑指offer 面试题29:数组中出现次数超过一半的数字及其变形(腾讯2015秋招 编程题4)

    剑指offer 面试题29:数组中出现次数超过一半的数字 提交网址: http://www.nowcoder.com/practice/e8a1b01a2df14cb2b228b30ee6a92163 ...

  10. 剑指Offer - 九度1504 - 把数组排成最小的数

    剑指Offer - 九度1504 - 把数组排成最小的数2014-02-06 00:19 题目描述: 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输 ...

随机推荐

  1. python @classmethod 的使用场合

    python @classmethod 的使用场合 官方的说法: classmethod(function)中文说明:classmethod是用来指定一个类的方法为类方法,没有此参数指定的类的方法为实 ...

  2. FastReport.Net使用:[33]高亮显示

    1.首先来看下初始报表,很简单很普通. 2.下面对报表改进,90分以上的成绩以绿色显示,60~70分的以橙色斜体显示. 报表设计中选择数据成绩文本框,然后点击工具栏上的“ab突出显示”按钮打开“高亮显 ...

  3. 【BZOJ 3294】 3294: [Cqoi2011]放棋子 (DP+组合数学+容斥原理)

    3294: [Cqoi2011]放棋子 Description Input 输入第一行为两个整数n, m, c,即行数.列数和棋子的颜色数.第二行包含c个正整数,即每个颜色的棋子数.所有颜色的棋子总数 ...

  4. [SimpleOJ236]暴风雨

    题目大意: 给你一棵n个点的树,以及m+q条信息. m条描述点a到b有边直接相连. q条描述点a和点b的LCA为c. 问有多少符合条件的以1为根的树. 思路: 状压DP. e[i]记录需要与点i直接相 ...

  5. bzoj1375 双调路径

    Description 来越多,因此选择最佳路径是很现实的问题.城市的道路是双向的,每条道路有固定的旅行时间以及需要支付的费用.路径由连续的道路组成.总时间是各条道路旅行时间的和,总费用是各条道路所支 ...

  6. codeforces VK Cup 2015 - Qualification Round 1 B. Photo to Remember 水题

    B. Photo to Remember Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/522/ ...

  7. Qt on android 蓝牙开发(控制小车)

    因为要做一个用蓝牙控制小车的app,就用着QT搞了下,网上关于QT蓝牙开发的资料比较少,我在这里记录下过程希望对看到了人有所帮助 首先在项目文件里添加 QT += bluetooth 这样就可以用QT ...

  8. setTimeout递归调用跳转页面

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  9. Swift使用NSKeyedArchiver进行数据持久化保存的经验

    iOS提供了几种数据持久化保存的方法,有NSKeyedArchiver,Property List,NSUserDefaults和CoreData.我学习下来,觉得保存应用内的诸如列表,记录这些东西, ...

  10. ios/object-c中的UIColor一些比较偏的颜色展示/示例

    UIColor blackColor]; [UIColor darkGrayColor]; [UIColor lightGrayColor]; [UIColor grayColor]; [UIColo ...