《剑指offer》c++版本 11. 旋转数组的最小数字
如题:
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
题意就是数组中查找最小值,最直接的方法就是排序后得到最小值,但是题目已经指明,数组为非递减数组。有序数组查找一个数,显然用二分法。这题最好的方法就是二分法,虽然暴力遍历找最小值也可以,但是既然有序了,何必画蛇添足。
仔细观察旋转有序数组,二分之后,必有一半是有序的,另一半可能是无序,也可能是有序(没有旋转)。比较方法就是取中值,和首尾比较即可。对于有序数组,左边界即为最小值,对于无序数组,继续递归二分,返回最小值。
此外,编码的时候,注意边界,比如数组为空,取中值不要用 mid = (start+end)/2 的方式,极端情况下整型溢出,最好用
mid = start+(end-start)/2;
下面是本题的c++编码:
//普通解法就是遍历数组查找最小值。
//此题的一个条件是递增数组,有序数组中查找一个数最好的方法是二分法
//二分查找,如果数组有序,返回最小值,如果无序则继续二分。
class Solution {
public:int getMinInArray(vector<int> &Array,int start, int end){int min1, min2;//边界判断if (start > end)return INT_MAX;if (start == end)return Array[start];//取中值int mid = (end-start)/2 + start;//有序数组if (Array[start] <= Array[mid]){min1 = Array[start];if (Array[mid+1] <= Array[end])min2 = Array[mid+1];else{//无序数组继续二分min2 = getMinInArray(Array, mid+1, end); }}else{//无序数组继续二分min1 = getMinInArray(Array, start, mid);min2 = Array[mid+1];}return min1 > min2 ? min2 : min1;}int minNumberInRotateArray(vector<int> rotateArray) {int min, len = rotateArray.size();vector<int> &rVec = rotateArray;//特殊情况处理if (rotateArray.size() < 1)return 0;return getMinInArray(rVec,0, len-1);}
};
=============================================================================================
Linux应用程序、内核、驱动、后台开发交流讨论群(745510310),感兴趣的同学可以加群讨论、交流、资料查找等,前进的道路上,你不是一个人奥^_^。
《剑指offer》c++版本 11. 旋转数组的最小数字相关推荐
- 剑指Offer - 面试题11. 旋转数组的最小数字(二分查找)
1. 题目 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] ...
- 剑指offer面试题11. 旋转数组的最小数字(二分查找)
题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的 ...
- 剑指offer面试题[8]-旋转数组的最小数字
题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个 ...
- 剑指offer(12)旋转数组的最小数字
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组 ...
- 剑指offe面试题8 旋转数组的最小数字 (java实现)
解题思路: 针对旋转数组的特点,即旋转后,数组的前半部分是有序的,后半部分是有序的. 1.先考虑一般情况:可以参考二分查找的思想,在数组中设置两个指针,一个指向数组的起始位置,一个指向数组的结束位置. ...
- 【剑指offer-Java版】08旋转数组的最小数字
旋转数组最小数字:暴力方法就是遍历-有效的方法是二分,但是存在失效的情况 几个特别的测试用例需要注意下: 数组中含有多个相同的数字 最小数字就是第一个 public class _Q08 {publi ...
- 《LeetCode力扣练习》剑指 Offer 11. 旋转数组的最小数字 Java
<LeetCode力扣练习>剑指 Offer 11. 旋转数组的最小数字 Java 一.资源 题目: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 给你一个可能存在 ...
- 剑指 Offer 11. 旋转数组的最小数字 简单
剑指 Offer 11. 旋转数组的最小数字 题目 解题思路 方法(一)直接遍历法 方法(二)二分查找法 题目 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组 ...
- 剑指offer 11. 旋转数组的最小数字(很详细!)
剑指offer 11. 旋转数组的最小数字 题目 解题思路 代码 题目 解题思路 一开始,我们就能直接想到,数组找最小值,那么不轻轻松松直接遍历一遍,用一个变量记录最小值,然后直接返回不就完事了? 但 ...
最新文章
- ggplot2笔记8:主题设置、存储导出
- 【c语言】蓝桥杯算法提高 c++_ch02_01
- android获取导航栏宽高,Android获取屏幕的宽高度、状态栏、标题栏、导航栏、编辑区域高度...
- C语言数组+冒泡排序
- 2010年北京大学计算机研究生机试真题
- GBDT和RF的区别
- No slave process to process jobs, aborting 报错!!!
- android root工具twrp,安卓手机没有twrp的情况,如何下刷入magisk并获得root权限.
- 计算机应用管理试题,学习管理系统中计算机应用试卷试题及答案.docx
- 云原生时代,开发者如何构筑容器安全?
- 干货 分布式事务 一文通
- 《深度学习笔记》——listnumpy索引操作的学习笔记
- 机器学习决策树_机器学习-决策树 Decision Tree
- 手机变身高清摄像头 DroidCamX完全使用教程
- unity读取Json文件
- zemax中如何和matlab中通信,如何在ZEMAX与MATLAB之间通信.doc
- 进阶实验5-3.2 新浪微博热门话题 (字符串操作)
- linux centos7 docker 安装nginx 使用宿主机配置文件
- 离散Laplace-Beltrami 算子
- fedora23 安装tftpd
热门文章
- 用几条shell命令快速去重10G数据
- Java接口和Java抽象类的认识
- (学)DEV在设计界面部分组件显示红叉并报错的问题
- 医疗在线服务InQuicker,融资0元年盈利400万美元!拒绝风投与炒作
- sqlserver excel,txt,access等文件的互導
- 基于vmware服务器虚拟化管理,基于Vmware的服务器虚拟化管理论文.doc
- 新风系统风速推荐表_家用新风常用管道规格和对应风量推荐值
- vue 点击事件传递多个参数_vue传事件参数
- java args包_Java Args.positive方法代码示例
- 戴尔塔式服务器各型号,戴尔_PowerEdge T440_塔式服务器_网络存储服务器_服务器 | Dell 中国大陆...