剑指Offer面试题:6.旋转数组中的最小数字
一 题目:旋转数组中的最小数字
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
这道题最直观的解法并不难,从头到尾遍历数组一次,我们就能找出最小的元素。这种思路的时间复杂度显然是O(n)。但是这个思路没有利用输入的旋转数组的特性,肯定达不到面试官的要求。
我们注意到旋转之后的数组实际上可以划分为两个排序的子数组,而且前面的子数组的元素都大于或者等于后面子数组的元素。我们还注意到最小的元素刚好是这两个子数组的分界线。在排序的数组中我们可以用二分查找法实现O(logn)的查找。
二 代码实现
#include "stdio.h"
#include <iostream>
using namespace std; #include <assert.h> // 遍历序列,找到最小值
int NormalFindMinVal(int *pStart, int *pEnd)
{
assert(pStart != NULL && pEnd != NULL);
int min = *pStart++;
while(pEnd - pStart >= )
{
if (min > *pStart)
{
min = *pStart;
} pStart++;
}
return min;
} int SearchMinInRotateaArr_1(int *pStart, int *pEnd)
{
if (pStart == NULL || pEnd == NULL)
{
return -;
}
if (pEnd - pStart == )
{
return *pEnd;
} int *pMid = NULL; pMid = pStart + (pEnd - pStart) / ; if (*pMid >= *pStart && *pMid <= *pEnd)
{
return NormalFindMinVal(pStart, pEnd);
}
if (*pMid >= *pStart)
{
pStart = pMid;
}
else if(*pMid <= *pEnd)
{
pEnd = pMid;
} return SearchMinInRotateaArr_1(pStart, pEnd);
} // 找到旋转数组中的最小数字
int SearchMinInRotateaArr(int arr[], int nLen)
{
assert(arr != NULL && nLen > ); int *pStart,*pEnd;
pStart = arr;
pEnd = pStart + nLen -; return SearchMinInRotateaArr_1(pStart, pEnd);
} int a[] = {,,,,};
int b[] = {,,,,,};
int c[] = {,,,,};
void main()
{
int data = SearchMinInRotateaArr(a,sizeof(a)/sizeof(a[]));
cout << data << endl;
data = SearchMinInRotateaArr(b,sizeof(b)/sizeof(b[]));
cout << data << endl;
data = SearchMinInRotateaArr(c,sizeof(c)/sizeof(c[]));
cout << data << endl;
return;
}
剑指Offer面试题:6.旋转数组中的最小数字的更多相关文章
- 剑指offer(6)旋转数组中的最小数字
题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个 ...
- (python)剑指Offer 面试题51:数组中重复的数字
问题描述 在长度为n的数组中,所有的元素都是0到n-1的范围内. 数组中的某些数字是重复的,但不知道有几个重复的数字,也不知道重复了几次,请找出任意重复的数字. 例如,输入长度为7的数组{2,3,1, ...
- 剑指offer 面试题3:数组中重复的数字
题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为 ...
- Leetcode - 剑指offer 面试题29:数组中出现次数超过一半的数字及其变形(腾讯2015秋招 编程题4)
剑指offer 面试题29:数组中出现次数超过一半的数字 提交网址: http://www.nowcoder.com/practice/e8a1b01a2df14cb2b228b30ee6a92163 ...
- 剑指Offer(书):数组中重复的数字
题目:找出数组中重复的数字. 说明:在一个长度为n的数组里的所有数字都在0~n-1的范围内,数组中某些数字是重复的,但是不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任意一个重复的数 ...
- 剑指Offer:面试题8——旋转数组的最小值(java实现)
题目描述: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入 一个递增排序的数组的一个旋转 输出 旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的 ...
- 剑指Offer面试题 二维数组中的查找
题目链接:https://www.nowcoder.com/questionTerminal/abc3fe2ce8e146608e868a70efebf62e 题目大意: 略 分析: 对萌醒很开拓思维 ...
- 《剑指offer》旋转数组中的最小数字
本题来自<剑指offer> 旋转数组中的最小数字 题目: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素. 例 ...
- 剑指Offer - 九度1386 - 旋转数组的最小数字
剑指Offer - 九度1386 - 旋转数组的最小数字2013-11-24 01:57 题目描述: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转 ...
随机推荐
- ubuntu下关于profile和bashrc中环境变量的理解
(0) 写在前面 有些名词可能需要解释一下.(也可以先不看这一节,在后面看到有疑惑再上来看相关解释) $PS1和交互式运行(running interactively): 简单地来说,交互式运行就是在 ...
- iOS设计模式探索
常用的 23 种设计模式 不管是 .NET 中的 C# 语言,还是 Java.VB.NET.C++ 或 Objective-C 语言,面向对象语言在设计模式的层面上都是相通的,只不过在设计模式的具体实 ...
- COS-2OS结构和硬件支持
操作系统(Operating System,简称OS),是电子计算机系统中负责支撑应用程序运行环境以及用户操作环境的系统软件,同时也是计算机系统的核心与基石.它的职责常包括对硬件的直接监管.对各种计算 ...
- sql 加密解密函数
if object_ID ( 'fn_ACITEncryption' ) is not null drop function fn_ACITEncryption go create ...
- windows系统下载地址大全&大白菜下载和教程
win10的 Windows10 64位纯净系统下载(不建议,后面的有原版) http://cjxt.sysdaa.com/down.php?post=win10-64&action=bend ...
- maven项目Dao层优化
平时我们习惯一个实体类就对应一个dao类,这样做,增删改查都大同小异,只是实体类对象不一样而已,因此,我们可以把公用的方法抽取来,建立一个IBaseDao接口,如下: public interface ...
- NumPy来自现有数据的数组
NumPy - 来自现有数据的数组 这一章中,我们会讨论如何从现有数据创建数组. numpy.asarray 此函数类似于numpy.array,除了它有较少的参数. 这个例程对于将 Python 序 ...
- Spring + Spring MVC + MyBatis框架整合
---恢复内容开始--- 一.Maven Web项目创建 如有需要,请参考:使用maven创建web项目 二.Spring + Spring MVC + MyBatis整合 1.Maven引入需要的J ...
- yii2:redis调用
参照手册,调用redis,报错,真坑: Yii::$app->redis 后改改用: Yii::getRedis();
- Confluence 6 测试电子邮件设置
一个 Confluence 的管理员可以通过下面的步骤测试电子邮件服务器的配置: 按照上面的步骤中描述得方法设置一个电子邮件服务器. 单击 发送测试邮件(Send Test Email)来检查你设置的 ...