题目描述:

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

输入:

输入可能包含多个测试样例,对于每个测试案例,

输入的第一行为一个整数n(1<= n<=1000000):代表旋转数组的元素个数。

输入的第二行包括n个整数,其中每个整数a的范围是(1<=a<=10000000)。

输出:

对应每个测试案例,

输出旋转数组中最小的元素。

样例输入:

    

样例输出:

 

解题思路:

  首先注意题目的要求,是递增数组的旋转数组。这怎么理解呢?

  比如,数组1 2 3 4 5,经过旋转可以旋转成为 2 3 4 5 1,或者 3 4 5 1 2 或者 1 2 3 4 5 或者 5 1 2 3 4等等。

  说的更复杂点,这其中的数字可以重复,那么数组 0 0 1 1 1 1 就可以旋转成为 1 1 1 0 0 1或者 1 1 1 1 0 0 等等,考虑到这些复杂的情况,那么就好处理了。

  这里最简单,也是钻空子的一种方式,就是在你输入数据的时候,直接检查,找出最小值。这种情况也是可以AC的。

  正常的解题思路,我们不能挨个遍历,这就显得不够高大上了,二典型的缩小时间复杂度的方法,就是二分查找了。但是考虑到一种特殊的情况,比如1 0 1 1 1是 0 1 1 1 1的旋转数组,此时进行二分,头尾中间都是1,这怎么判断呢?那么我们就两遍都进行一次查找,最后的结果进行一次比较就可以了。这样明显可以缩小时间复杂度。

钻空子的代码:

#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
int arr[];
int main(void){
int i,n;
while(scanf("%d",&n)!=EOF && n>= && n <= ){
memset(&arr,,sizeof(int)*);
int smallest = ;
for(i=;i<n;i++){
scanf("%d",&arr[i]);
if(smallest > arr[i])
smallest = arr[i];
}
printf("%d\n",smallest);
}
return ;
}
/**************************************************************
Problem: 1386
User: xhalo
Language: C
Result: Accepted
Time:1000 ms
Memory:4820 kb
****************************************************************/

正常的解题思路:

#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
int arr[];
int binarySearch(int *arr,int front,int rear);
int main(void){
int i,n;
while(scanf("%d",&n)!=EOF && n>= && n <= ){
memset(&arr,,sizeof(int)*);
int smallest = ;
for(i=;i<n;i++){
scanf("%d",&arr[i]);
}
printf("%d\n",binarySearch(arr,,n-));
}
return ;
}
int binarySearch(int *arr,int front,int rear){
if(front+ == rear || front == rear)
return arr[rear]<arr[front]?arr[rear]:arr[front];
int index = (front+rear)/;
if(arr[front] == arr[index] && arr[rear] == arr[index]){//此时两边中间都一样,考虑到特殊情况,我们两遍均遍历一次,进行最后的比较大小。
int find1 = binarySearch(arr,front,index);
int find2 = binarySearch(arr,index+,rear);
return find1<find2?find1:find2;
}else if(arr[index] >= arr[front] && arr[index] > arr[rear])
binarySearch(arr,index,rear);
else
binarySearch(arr,front,index);
}
/**************************************************************
Problem: 1386
User: xhalo
Language: C
Result: Accepted
Time:990 ms
Memory:4820 kb
****************************************************************/

剑指OFFER之旋转数组的最小数字(九度OJ1386)的更多相关文章

  1. 剑指Offer:旋转数组的最小数字【11】

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

  2. ⛅剑指 Offer 11. 旋转数组的最小数字

    20207.22 LeetCode 剑指 Offer 11. 旋转数组的最小数字 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小 ...

  3. [剑指 Offer 11. 旋转数组的最小数字]

    [剑指 Offer 11. 旋转数组的最小数字] 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如,数组 [3,4,5, ...

  4. 【Java】 剑指offer(10) 旋转数组的最小数字

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. ...

  5. Go语言实现:【剑指offer】旋转数组的最小数字

    该题目来源于牛客网<剑指offer>专题. 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3, ...

  6. 剑指Offer 6. 旋转数组的最小数字 (数组)

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

  7. 《剑指offer》-旋转数组的最小数字

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

  8. 剑指offer例题——旋转数组的最小数字

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

  9. 【剑指offer】旋转数组的最小数字

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

随机推荐

  1. H264 帧结构分析、帧判断

    http://blog.csdn.net/dxpqxb/article/details/7631304 H264以NALU(NAL unit)为单位来支持编码数据在基于分组交换技术网络中传输. NAL ...

  2. javascript实现map的功能(转载)

    /* * MAP对象,实现MAP功能 * * 接口: * size() 获取MAP元素个数 * isEmpty() 判断MAP是否为空 * clear() 删除MAP所有元素 * put(key, v ...

  3. 在web.config里使用configSource分隔各类配置

    转:http://www.yongfa365.com/Item/using-configSource-Split-Configs.html 大型项目中,可能有多个Service,也就是会有一堆配置,而 ...

  4. HDU 5762 Teacher Bo

    Teacher Bo Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Tota ...

  5. [Papers]NSE, $\pi$, Lorentz space [Suzuki, NA, 2012]

    $$\bex \sen{\pi}_{L^{s,\infty}(0,T;L^{q,\infty}(\bbR^3))} \leq \ve_*, \eex$$ with $$\bex \frac{2}{s} ...

  6. Spring Bean基本管理--bean注入方式汇总

    依赖注入方式:Spring支持两种依赖注入方式,分别是属性注入和构造函数注入.还有工厂方法注入方式. 依赖注入还分为:注入依赖对象可以采用手工装配或自动装配,在实际应用开发中建议使用手工装配,因为自动 ...

  7. slidingmenu + fragment 左右菜单滑动

                           content_frame.xml <?xml version="1.0" encoding="utf-8" ...

  8. 同行评审 Peer Review

    周五的课上,章老师给我们上了一节关于同行评审(Peer Review)的课程,让我了解了以前并不熟悉的这一过程.课上我们就姚思丹同学项目组做的项目,分组进行了审查. 首先介绍一下同行评审(Peer R ...

  9. 《Python 学习手册4th》 第六章 动态类型简介

    ''' 时间: 9月5日 - 9月30日 要求: 1. 书本内容总结归纳,整理在博客园笔记上传 2. 完成所有课后习题 注:“#” 后加的是备注内容 (每天看42页内容,可以保证月底看完此书)“重点笔 ...

  10. html 5新特性 --用SVG绘制的微信logo

    一个简单的SVG绘制图片的小案例. 效果图: 代码如下: <style> * { ; ; } body { background-color: #d5d3d4; } .container ...