【剑指offer】旋转数组的最小值
转载请注明出处:http://blog.csdn.net/ns_code/article/details/25335043
如今对算法真的是由衷地热爱啊,总是忍不住想要A题(本科都没这意识,哎,把时间都浪费在了考试拿奖学金和所谓的学生工作上了),并且数学一直以来都是自己的强项,希望在这方面以后能应用好。尽管在ACM方面还仅仅是个小学生。以后即使工作了,也要把ACM坚持下去。无关乎工作,仅仅关乎兴趣。
依旧是剑指offer上的题目,第8题,在九度OJ上測试通过。
时间限制:1 秒
内存限制:32 兆
- 题目描写叙述:
-
把一个数组最開始的若干个元素搬到数组的末尾。我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。
比如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
- 输入:
-
输入可能包括多个測试例子。对于每一个測试案例,
输入的第一行为一个整数n(1<= n<=1000000):代表旋转数组的元素个数。
输入的第二行包括n个整数。当中每一个整数a的范围是(1<=a<=10000000)。
- 输出:
-
相应每一个測试案例,
输出旋转数组中最小的元素。
- 例子输入:
-
53 4 5 1 2
- 例子输出:
-
1
採用二分查找的策略,重点要考虑一些边界情况:旋转了0元素。即输入的是一个升序排列的数组、仅仅包括一个数字的数组、有非常多反复数字的数组等。
AC代码:
#include<stdio.h>
#include<stdlib.h> int main()
{
int n;
while(scanf("%d",&n) != EOF)
{
int *A = (int *)malloc(n*sizeof(int));
if(A == NULL)
exit(EXIT_FAILURE);
int i;
for(i=0;i<n;i++)
scanf("%d",A+i); int p1 = 0;
int p2 = n-1;
int mid = p1;
while(A[p1] >= A[p2])
{
if(p2-p1 == 1)
{
mid = p2;
break;
}
mid = (p1+p2)/2;
//特殊情况,仅仅能顺序查找
if(A[p1]==A[mid] && A[p2]==A[mid])
{
mid = p1;
int i;
for(i=p1+1;i<=p2;i++)
{
if(A[mid] > A[i])
mid = i;
}
break;
}
if(A[mid]>=A[p1])
p1 = mid;
else if(A[mid]<=A[p2])
p2 = mid;
}
printf("%d\n",A[mid]);
free(A);
A = 0;
}
return 0;
}
/**************************************************************
Problem: 1386
User: mmc_maodun
Language: C
Result: Accepted
Time:700 ms
Memory:4820 kb
****************************************************************/
【剑指offer】旋转数组的最小值的更多相关文章
- 剑指Offer 旋转数组的最小数字
题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转 ...
- 剑指offer 旋转数组
class Solution { public: int minNumberInRotateArray(vector<int> rotateArray) { //常规的遍历方法时间是O(N ...
- 剑指Offer——旋转数组的最小数字
题目描述: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一 ...
- 用js刷剑指offer(旋转数组的最小数字)
题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个 ...
- 剑指Offer06 旋转数组的最小值
/************************************************************************* > File Name: 06_MinNum ...
- 剑指 Offer 51. 数组中的逆序对 + 归并排序 + 树状数组
剑指 Offer 51. 数组中的逆序对 Offer_51 题目描述 方法一:暴力法(双层循环,超时) package com.walegarrett.offer; /** * @Author Wal ...
- 剑指Offer:数组中出现次数超过一半的数字【39】
剑指Offer:数组中出现次数超过一半的数字[39] 题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如,输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于这 ...
- 《剑指offer》数组中只出现一次的数字
本题来自<剑指offer> 数组中只出现一次的数字 题目: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 思路: 思路一:在<剑指of ...
- 剑指 Offer 39. 数组中出现次数超过一半的数字 + 摩尔投票法
剑指 Offer 39. 数组中出现次数超过一半的数字 Offer_39 题目描述 方法一:使用map存储数字出现的次数 public class Offer_39 { public int majo ...
- 剑指 Offer 03. 数组中重复的数字
剑指 Offer 03. 数组中重复的数字 找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知 ...
随机推荐
- 基于visual Studio2013解决C语言竞赛题之1091多项式
题目 解决代码及点评 /************************************************************************/ /* ...
- Servlet的学习(一)
初识Servlet Servlet是一门专门用于开发动态web资源的技术,Sun公司在其API中提供了一个Servlet接口(当然,我们不会去直接实现这个接口,而是去继承其实现类会更好),因此,狭义的 ...
- Spring的事件处理
Spring对事件有一些支持,因为项目须要,所以近期小小研究了下究竟这个怎么能够方便的用在实际项目其中来. 说起事件这个东西,事实上就是借鉴的那个观察者模式.这里面涉及到事件源.事件监听者.事件公布者 ...
- POJ1273_Drainage Ditches(网络流)
Drainage Ditches Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 54887 Accepted: 2091 ...
- 【PAT】1035. Password (20)
题目:http://pat.zju.edu.cn/contests/pat-a-practise/1035 分析:简单题.直接搜索,然后替换,不会超时,但是应该有更好的办法. 题目描述: To pre ...
- 自己定义android 4.0以上的对话框风格
做个笔记.这里是Dialog的风格,假设是用AlertDialog创建的,不能直接用.在styles.xml的写法: <style name="DialogWindowTitle&qu ...
- iotop 分析系统那些进程占用io资源
iotop -b -o -t -qqq >> /tmp/iotop.log 1.直接yum安装,rh6的光盘里有包. yum install iotop 2.命令参数介绍 -o ...
- html name id, 与服务器交互必须有name
html name id, 与服务器交互必须有name 在HTML中元素的ID和Name的区别和联系. 今天写了个测试,在php脚本里怎么也获取不到$_POST['userName']的值,经检查在h ...
- 通过加载Kernel32来动态判断 当前操作系统32bit还是64bit
工作原理:通过加载Kernel32来获取IsWow64Process 函数然后通过函数的地址操作,执行函数的操作. 在程序中只要我们获取了一个函数的地址,就可以找到正确的方法执行这个函数. 但是这种方 ...
- mfc 导出数据保存成excel和txt格式
最近做了一些东西,项目到了收尾的工作.不过这次我没有参与到控件机器的功能的那一部分,都是主管自己写的.不过,所有的控件重写都是由我来做的.还有数据库这一方面是我和主管共同完成的.不过还不错,主管写一部 ...