剑指OFFER之旋转数组的最小数字(九度OJ1386)
题目描述:
-
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{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)的更多相关文章
- 剑指Offer:旋转数组的最小数字【11】
剑指Offer:旋转数组的最小数字[11] 题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4 ...
- ⛅剑指 Offer 11. 旋转数组的最小数字
20207.22 LeetCode 剑指 Offer 11. 旋转数组的最小数字 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小 ...
- [剑指 Offer 11. 旋转数组的最小数字]
[剑指 Offer 11. 旋转数组的最小数字] 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如,数组 [3,4,5, ...
- 【Java】 剑指offer(10) 旋转数组的最小数字
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. ...
- Go语言实现:【剑指offer】旋转数组的最小数字
该题目来源于牛客网<剑指offer>专题. 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3, ...
- 剑指Offer 6. 旋转数组的最小数字 (数组)
题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋 ...
- 《剑指offer》-旋转数组的最小数字
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数 ...
- 剑指offer例题——旋转数组的最小数字
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转, ...
- 【剑指offer】旋转数组的最小数字
一.题目: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个 ...
随机推荐
- hdu 4617 Weapon(叉积)
大一学弟表示刚学过高数,轻松无压力. 我等学长情何以堪= = 求空间无限延伸的两个圆柱体是否相交,其实就是叉积搞一搞 详细点就是求两圆心的向量在两直线(圆心所在的直线)叉积上的投影 代码略挫,看他的吧 ...
- acdream 1408 "Money, Money, Money" (水)
题意:给出一个自然数x,要求找两个自然数a和b,任意多个a和b的组合都不能等于x,且要可以组合成大于x的任何自然数.如果找不到就输出两个0.(输出任意一个满足条件的答案) 思路:x=偶数时,无法构成, ...
- Java [Leetcode 232]Implement Queue using Stacks
题目描述: Implement the following operations of a queue using stacks. push(x) -- Push element x to the b ...
- mysql违背了唯一约束
执行一批数据,违背唯一约束时会中断,导致后面的数据写不进去. mysql有提供ignore关键字,使用insert ignore into .... 这样,当违背了唯一约束的时候~就会直接跳过,不会报 ...
- 【Unity3D】Unity自带组件—完成第一人称人物控制
1.导入unity自带的Character Controllers包 2.可以看到First Person Controller组件的构成 Mouse Look() : 随鼠标的移动而使所属物体发生旋 ...
- Zend Framework 入门(4)—页面布局
Zend Framework 的页面布局模块——Zend_Layout——既可以跟 MVC 一起使用,也可以单独使用.本文只讨论与 MVC 一起使用的情况. 1. 布局脚本 在 application ...
- 打印Ibatis最终的SQL语句
在项目开发时都大家都希望将SQL在后台打印出来,以帮助开发以及后续的bug修改.如果用JDBC那么可以方便的打印,可使用ibatis就不知道怎么办了,最近在网上找了一段log4j的配置可以很保姆的处理 ...
- Java SE 6 新特性: 对脚本语言的支持
2006 年底,Sun 公司发布了 Java Standard Edition 6(Java SE 6)的最终正式版,代号 Mustang(野马).跟 Tiger(Java SE 5)相比,Musta ...
- Delphi 操作Word怎么控制光标的位置
unit ControlWordS; interface uses Classes, Sysutils, Word97; type TControlWord = class(TComponent) ...
- SqlServer获取两个日期时间差
SELECT datediff(yy,'2010-06-1 10:10',GETDATE()) --计算多少年 SELECT datediff(q,'2011-01-1 10:10',GETDATE( ...