42.旋转数组的最小元素[Get min value of rotated array]
【题目】
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个排好序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1。
【分析】
这道题最直观的解法并不难。从头到尾遍历数组一次,就能找出最小的元素,时间复杂度显然是O(N)。但这个思路没有利用输入数组的特性,我们应该能找到更好的解法。
我们容易想到二分查找,其时间复杂度为O(logn)。这个问题是否可以运用二分查找呢?答案是肯定的。观察一下数组的特性,首先递增(称为递增a),然后突然下降到最小值,然后再递增(称为递增b)。
对于一般的情况,假设A为输入数组,left 和 right 为数组左右边界的坐标,考察中间位置的值A[mid] 。
(1)如果A[mid] >= A[left],表明处于递增a,因此调整left = mid。
(2)如果A[mid] <= A[right],表明处于递增b,调整right = mid。
经过若干次调整以后,left指向递增a的最后一个元素,right指向递增b的第一个元素;此时left和right相邻,即right-left==1,那么较小的一个A[right]就是数组的最小值。
但是还有特殊情况需要考虑:
(3)旋转元素个数为0,即旋转数组本身就是递增序列。即A[left]<A[right],那么A[left]就是最小值。
(4)如果A[left]== A[mid]== A[right],若果仍然按照(1)(2)的做法,那么最终left和right会指向同一个元素,即left=right,而无法跳出循环,此时就要使用常规方法求解。
举几个具体例子就清楚了:
{3, 4, 5, 1, 2},A[mid] >A[left]> A[right],最终left==right-1,最小值为1;符合(1,2)。
{3, 4, 5, 1, 3},A[mid] >A[left]=A[right],最终left==right-1,最小值为1;符合(1,2)。
{3, 3, 3, 1,2},A[mid]=A[left]>A[right],最终left==right-1,最小值为1;符合(1,2)。
{3, 3, 3, 1,3},A[mid]=A[left]=A[right],常规方法求解,最小值为1;符合(4)。
{1, 2, 3, 4, 5},A[left]<A[right],最小值为1;符合(3)。
【代码】
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 |
// 42_GetRotationArrayMinValue.cpp : Defines the entry point for the console application.
// #include "stdafx.h" // Get min value from data[left] to data[right] ; // special case // normal cases void test_base(int *data, int n) void test_case1() void test_case2() void test_main() int _tmain(int argc, _TCHAR *argv[]) |
最后总结一下本面试题的主要考点:
1. 考查对二分查找的理解。本题变换了二分查找的条件,输入数组不是排序的,而是排序数组的一个旋转。这要求我们对二分查找的过程有深刻的理解。
2. 考查沟通学习能力。如果在面试过程中,面试官提出新的概念,比如“数组的旋转”,我们要主动和面试官沟通,多问几个问题把概念弄清楚。
3. 考查思维的全面性。比如要考虑到:(1)排序数组本身是数组旋转的一个特例;(2)要考虑到数组中有相同数字的特例。如果不能很好处理这些特例,就很难写出让面试官满意的完美代码。
【参考】
http://zhedahht.blog.163.com/blog/static/25411174200952765120546/
http://zhuyanfeng.com/archives/2923
http://blog.csdn.net/wuzhekai1985/article/details/6733700
42.旋转数组的最小元素[Get min value of rotated array]的更多相关文章
- 【Offer】[11] 【旋转数组的最小元素】
题目描述 思路分析 Java代码 代码链接 题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4, ...
- 九度OJ 1386 旋转数组的最小数字 【算法】
题目地址:http://ac.jobdu.com/problem.php?pid=1386 题目描述: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋 ...
- 剑指Offer 旋转数组的最小数字
题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转 ...
- 剑指offer-面试题8.旋转数组的最小数字
题目:把一个数组最开始的若干个元素搬到数据的末尾,我们称之为 数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组 的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转, ...
- 旋转数组的最小数字(JAVA)
旋转数组的最小数字 题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2 ...
- 剑指offer六之求旋转数组的最小数字
一.题目 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个 ...
- 《剑指offer》第十一题(旋转数组的最小数字)
// 面试题:旋转数组的最小数字 // 题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. // 输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如数组 // {3, ...
- (剑指Offer)面试题8:旋转数组的最小数字
题目: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转 ...
- 旋转数组的最小数字(C++ 和 Python 实现)
(说明:本博客中的题目.题目详细说明及参考代码均摘自 “何海涛<剑指Offer:名企面试官精讲典型编程题>2012年”) 题目 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的 ...
随机推荐
- Java基础-代理
我们书写执行一个功能的函数时,经常需要在其中写入与功能不是直接相关但很有必要的代 码,如日志记录,信息发送,安全和事务支持等,这些枝节性代码虽然是必要的,但它会带 来以下麻烦: 枝节性代码游离在功能性 ...
- 【BZOJ-1406】密码箱 约数 + 乱搞 + set?
1406: [AHOI2007]密码箱 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1143 Solved: 677[Submit][Status][ ...
- 【poj2234】 Matches Game
http://poj.org/problem?id=2234 (题目链接) 题意 经典取火柴游戏 Solution 裸的Nim游戏,也就是取石子. 整个游戏的sg值为每一堆火柴(子游戏)的异或和. 代 ...
- 洛谷P1363 幻想迷宫
题目描述 背景 Background (喵星人LHX和WD同心协力击退了汪星人的入侵,不幸的是,汪星人撤退之前给它们制造了一片幻象迷宫.) WD:呜呜,肿么办啊…… LHX:momo...我们一定能走 ...
- c中动态使用数组
#include <iostream> #include <fstream> #include<stdlib.h> #define MAXNUM 200 int I ...
- [Angularjs]ng-repeat中使用ng-model遇到的问题
写在前面 在ng-reapet中如何为ng-model双向绑定呢?在项目中确实遇到这样的问题,绑定了,但是在controller中获取不到它的值,确实挺奇怪的. 系列文章 [Angularjs]ng- ...
- hdu 2085 核反应堆
看完题,想到用结构体存储高质点和低质点,然后打表存储<33的质点数量. #include<stdio.h> struct hilo { long long hi,lo; }; int ...
- springmvc中@PathVariable和@RequestParam的区别(百度收集)
http://localhost:8080/Springmvc/user/page.do?pageSize=3&pageNow=2 你可以把这地址分开理解,其中问号前半部分:http://lo ...
- ftp (文件传输协议)
ftp (文件传输协议) 锁定 本词条由“科普中国”百科科学词条编写与应用工作项目 审核 . FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议” ...
- linux用命令行来执行php程序
<?php $start = microtime(true); for($i=0 ; $i <10000 ; $i ++){ // echo '正在执行第'.$i.'个操作! '.PHP_ ...