【剑指offer】11--旋转数组的最小数字(二分查找)
原创博文,转载请注明出处!
# 本文是牛客网《剑指offer》刷题笔记
1.题目
旋转数组的最小数字:输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
注意:给出的所有元素都大于0,若数组大小为0,请返回0。
2.思路
- 空数组查找最小元素:
输出0
- 非空数组查找最小元素:
# 如果输入旋转0个元素的旋转数组,则第一个元素即最小元素
# 如果输入旋转n个元素的旋转数组,则按二分查找和顺序查找的思路查找最小元素
二分查找过程:
旋转数组特性:旋转数组将原有序数组分成递增子数组1和递增子数组2,递增子数组1的元素>=递增子数组2,最小元素是两个子数组的分界线。设置辅助变量:指针left指向旋转数组的第一个元素;指针mid指向旋转数组中间位置的元素;指针right指向旋转数组最后一个元素。
如果mid指向的元素>=left指向的元素,则mid位于递增子数组1,数组中最小元素位与中间元素的后面,将left指向mid后,缩小一半的寻找范围
如果mid指向的元素<=right指向的元素,则mid位于递增子数组2,数组中最小元素位与中间元素的前面,将right指向mid后,缩小一半的寻找范围
如果mid指向的元素==left指向的元素==right指向的元素,则无法确定mid位于哪个递增子数组,无法折半查找,只能顺序查找
二分查找结束标志:
left指针始终指向递增子数组1,right指针始终指向递增子数组2,最终left指针指向递增子数组1的最后一个元素,right指针指向递增子数组2的第一个元素。当left+1=right时结束循环,right位置的元素即为最小元素。7
3.code
#include <iostream>
#include <vector>
using namespace std; class Solution {
public:
int minNumberInRotateArray(vector<int> rotateArray)
{
// 空数组
int size = rotateArray.size(); //数组长度
if(size == 0)
{
return 0;
} // 非空数组
int left = 0; //左指针
int right = size - 1; //右指针
int mid = 0; //中间指针(未旋转时直接输出rotateArray[0]) while(rotateArray[left] >= rotateArray[right])
{
// 循环结束标志(左右指针相邻)
if(left+1 == right)
{
mid = right;
break;
} // 计算中间指针位置
mid = left + (right - left) / 2; //特殊情况:如果无法确定中间元素是属于前面还是后面的递增子数组,只能顺序查找
if(rotateArray[left] == rotateArray[right] && rotateArray[mid] == rotateArray[left]){
return MinInOrder(rotateArray, left, right);
}
//中间元素位于前面的递增子数组,此时最小元素位于中间元素的后面
if(rotateArray[mid] >= rotateArray[left]){
left = mid;
}
//中间元素位于后面的递增子数组,此时最小元素位于中间元素的前面
else{
right = mid;
}
}
return rotateArray[mid];
}
private:
//顺序寻找最小值
int MinInOrder(vector<int> &num, int left, int right){
int result = num[left];
for(int i = left + 1; i <= right; i++){
if(num[i] < result){
result = num[i];
}
}
return result;
}
};
int main()
{
Solution solution;
vector<int> rotateArray = {4,5,1,2,3,4};
cout<<solution.minNumberInRotateArray(rotateArray)<<endl;
return 0;
}
4.复杂度
时间复杂度O(logn)
5.测试用例
- 空指针
- 一个元素的数组
- 未旋转的数组
- 旋转的数组(无重复数字和有重复数字)
【剑指offer】11--旋转数组的最小数字(二分查找)的更多相关文章
- ⛅剑指 Offer 11. 旋转数组的最小数字
20207.22 LeetCode 剑指 Offer 11. 旋转数组的最小数字 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小 ...
- [剑指 Offer 11. 旋转数组的最小数字]
[剑指 Offer 11. 旋转数组的最小数字] 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如,数组 [3,4,5, ...
- 剑指Offer:旋转数组的最小数字【11】
剑指Offer:旋转数组的最小数字[11] 题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4 ...
- 【Java】 剑指offer(10) 旋转数组的最小数字
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. ...
- 剑指offer——11旋转数组中最小的数字
题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转 ...
- Go语言实现:【剑指offer】旋转数组的最小数字
该题目来源于牛客网<剑指offer>专题. 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3, ...
- 剑指OFFER之旋转数组的最小数字(九度OJ1386)
题目描述: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转 ...
- 剑指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}的一个旋转, ...
随机推荐
- 【Network Architecture】Feature Pyramid Networks for Object Detection(FPN)论文解析(转)
目录 0. 前言 1. 博客一 2.. 博客二 0. 前言 这篇论文提出了一种新的特征融合方式来解决多尺度问题, 感觉挺有创新性的, 如果需要与其他网络进行拼接,还是需要再回到原文看一下细节.这里 ...
- [解决]JS失效,提示HTML1114: (UNICODE 字节顺序标记)的代码页 utf-8 覆盖(META 标记)的冲突的代码页 utf-8
上网找了找,木有找到相关的解决办法,索性自己试了试. 原页面是这样写的: <html> <head> <meta http-equiv="Content-Typ ...
- Elasticsearch6.0之一:安装
基于windows平台,安装Elasticsearch, Elasticsearch-head. 1. 安装JAVA SDK,配置好环境变量 2. 安装NodeJs NPM, Grunt. npm ...
- java高级特性(4)--枚举
枚举(enum),是指一个经过排序的.被打包成一个单一实体的项列表.一个枚举的实例可以使用枚举项列表中任意单一项的值.枚举在各个语言当中都有着广泛的应用,通常用来表示诸如颜色.方式.类别.状态等等数目 ...
- 设计模式--迭代器模式C++实现
迭代器模式C++实现 1定义 他提供一种方法访问一个容器对象中的各个元素,而不暴漏该对象内部细节 注:迭代器是为容器服务的.迭代器模式提供了遍历容器的方便性,容器只管理增减元素就好,需要遍历时交给迭代 ...
- Linux命令详解-rm
rm命令.rm是常用的命令,该命令的功能为删除一个目录中的一个或多个文件或目录,它也可以将某个目录及其下的所有文件及子目录均删除.对于链接文件,只是删除了链接,原有文件均保持不变. rm是一个危险的命 ...
- 论Sava(),SaveOrUpdate(),Merge()区别
一.Save(): 用于将一个临时对象转变为持久化对象,也就是将一个新的业务实体保存到数据库中:相当于jdbc的insert. <假如两个实体之间有关系(例如employee表和address表 ...
- docker nginx 问题
'经常不启动docker会遇到如下问题 启动docker pull * 会报错 1. 安装步骤: 解决办法:命令输入:docker logout 再次执行:docker pull * 2. 执行ru ...
- Linux服务器中木马(肉鸡)手工清除方法(转)
首先剧透一下后门木马如下: (当然这是事后平静下来后慢慢搜出来的,那个时候喝着咖啡感觉像个自由人) 木马名称 Linux.BackDoor.Gates.5 http://forum.antichat. ...
- 使用Python自带的库和正则表达式爬取熊猫直播主播观看人气
主要是体现代码的规范性 from urllib import request import re class Spider(): url = 'https://www.panda.tv/cate/lo ...