如题:

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{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. 旋转数组的最小数字相关推荐

  1. 剑指Offer - 面试题11. 旋转数组的最小数字(二分查找)

    1. 题目 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] ...

  2. 剑指offer面试题11. 旋转数组的最小数字(二分查找)

    题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的 ...

  3. 剑指offer面试题[8]-旋转数组的最小数字

    题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个 ...

  4. 剑指offer(12)旋转数组的最小数字

    把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组 ...

  5. 剑指offe面试题8 旋转数组的最小数字 (java实现)

    解题思路: 针对旋转数组的特点,即旋转后,数组的前半部分是有序的,后半部分是有序的. 1.先考虑一般情况:可以参考二分查找的思想,在数组中设置两个指针,一个指向数组的起始位置,一个指向数组的结束位置. ...

  6. 【剑指offer-Java版】08旋转数组的最小数字

    旋转数组最小数字:暴力方法就是遍历-有效的方法是二分,但是存在失效的情况 几个特别的测试用例需要注意下: 数组中含有多个相同的数字 最小数字就是第一个 public class _Q08 {publi ...

  7. 《LeetCode力扣练习》剑指 Offer 11. 旋转数组的最小数字 Java

    <LeetCode力扣练习>剑指 Offer 11. 旋转数组的最小数字 Java 一.资源 题目: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 给你一个可能存在 ...

  8. 剑指 Offer 11. 旋转数组的最小数字 简单

    剑指 Offer 11. 旋转数组的最小数字 题目 解题思路 方法(一)直接遍历法 方法(二)二分查找法 题目 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组 ...

  9. 剑指offer 11. 旋转数组的最小数字(很详细!)

    剑指offer 11. 旋转数组的最小数字 题目 解题思路 代码 题目 解题思路 一开始,我们就能直接想到,数组找最小值,那么不轻轻松松直接遍历一遍,用一个变量记录最小值,然后直接返回不就完事了? 但 ...

最新文章

  1. ggplot2笔记8:主题设置、存储导出
  2. 【c语言】蓝桥杯算法提高 c++_ch02_01
  3. android获取导航栏宽高,Android获取屏幕的宽高度、状态栏、标题栏、导航栏、编辑区域高度...
  4. C语言数组+冒泡排序
  5. 2010年北京大学计算机研究生机试真题
  6. GBDT和RF的区别
  7. No slave process to process jobs, aborting 报错!!!
  8. android root工具twrp,安卓手机没有twrp的情况,如何下刷入magisk并获得root权限.
  9. 计算机应用管理试题,学习管理系统中计算机应用试卷试题及答案.docx
  10. 云原生时代,开发者如何构筑容器安全?
  11. 干货 分布式事务 一文通
  12. 《深度学习笔记》——listnumpy索引操作的学习笔记
  13. 机器学习决策树_机器学习-决策树 Decision Tree
  14. 手机变身高清摄像头 DroidCamX完全使用教程
  15. unity读取Json文件
  16. zemax中如何和matlab中通信,如何在ZEMAX与MATLAB之间通信.doc
  17. 进阶实验5-3.2 新浪微博热门话题 (字符串操作)
  18. linux centos7 docker 安装nginx 使用宿主机配置文件
  19. 离散Laplace-Beltrami 算子
  20. fedora23 安装tftpd

热门文章

  1. 用几条shell命令快速去重10G数据
  2. Java接口和Java抽象类的认识
  3. (学)DEV在设计界面部分组件显示红叉并报错的问题
  4. 医疗在线服务InQuicker,融资0元年盈利400万美元!拒绝风投与炒作
  5. sqlserver excel,txt,access等文件的互導
  6. 基于vmware服务器虚拟化管理,基于Vmware的服务器虚拟化管理论文.doc
  7. 新风系统风速推荐表_家用新风常用管道规格和对应风量推荐值
  8. vue 点击事件传递多个参数_vue传事件参数
  9. java args包_Java Args.positive方法代码示例
  10. 戴尔塔式服务器各型号,戴尔_PowerEdge T440_塔式服务器_网络存储服务器_服务器 | Dell 中国大陆...