题目描述

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。

解题思路

{3,4,5,1,2}为{1,2,3,4,5}的旋转,前半部分始终大于等于后半部分,符合部分有序。仍然可以使用二分查找法,可判断中间位置在前半部分还是在后半部分,如果在前半部分则min 在后半部分,否则在前半部分。这样进行二分查找。
但是有特殊情况,当为这种情况时{1,1,1,0,1}或者{1,0,1,1,1}使用二分查找不会得到正确的结果,这种情况只能使用顺序查找了。

解题代码

#include <vector>
#include <iostream>
using namespace std;
/*
题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
*/
class SolutionMinNum {
public:int minNumberInRotateArray(vector<int> rotateArray) {if (rotateArray.size() == 0)return 0;int low = 0;int high = rotateArray.size()-1;int mid = low;while (rotateArray[low] >= rotateArray[high]){if (high - low == 1){mid = high;break;}int mid = (low + high)/2;//特殊情况,{1,1,1,0,1}(只使用二分查找碰见可以查找成功,会走第一个if) 或者 {1,0,1,1,1}(只使用二分查找失败)需要使用顺序查找if (rotateArray[low] == rotateArray[mid] &&rotateArray[mid] == rotateArray[high])      return minInOrder(rotateArray, low, high);if (rotateArray[mid] >= rotateArray[low])       //最小值在后边low = mid;else if (rotateArray[mid] <= rotateArray[high]) //最小值在前边high = mid;}return rotateArray[mid];}int minInOrder(vector<int> & rotateArray, int low, int high)    //顺序查找最小值{int min = rotateArray[low];for (int i = low +1; i <=high; i++){if (min > rotateArray[i])min = rotateArray[i];}return min;}
};int main(int argc, char *argv[])
{SolutionMinNum MinNum;vector<int> arr1 = { 3,4,5,1,2 };vector<int> arr2 = { 1, 1, 1, 0, 1 };vector<int> arr3 = { 1, 0, 1, 1, 1 };int min = MinNum.minNumberInRotateArray(arr1);cout << min << endl;min = MinNum.minNumberInRotateArray(arr2);cout << min << endl;min = MinNum.minNumberInRotateArray(arr3);cout << min << endl;system("pause");return EXIT_SUCCESS;
}

运行测试

C/C++面试题—旋转数组的最小数字相关推荐

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

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

  2. 剑指offer——面试题8:旋转数组的最小数字

    剑指offer--面试题8:旋转数组的最小数字 Solution1: 自己想的复杂度为O(n)O(n)O(n)的算法,若用二分查找则: 1.代码复杂:2.最坏情况下的二分查找的时间复杂度亦为O(n)O ...

  3. 剑指offer:面试题11. 旋转数组的最小数字

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

  4. 剑指offer_第6题_旋转数组的最小数字

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

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

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

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

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

  7. LeetCode-剑指 Offer 11. 旋转数组的最小数字

    剑指 Offer 11. 旋转数组的最小数字 思路一:先排序,返回第一个数组值 class Solution {public:int minArray(vector<int>& n ...

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

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

  9. 剑指Offer #06 旋转数组的最小数字(二分查找)| 图文详解

    题目来源:牛客网-剑指Offer专题 题目地址:旋转数组的最小数字 题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小 ...

最新文章

  1. 固态硬盘驱动器在设计上有个安全漏洞 易导致数据损毁
  2. 解读Raw Socket
  3. python中的timeit模块的用法
  4. VMware-workstation安装手册
  5. lvm快照备份mysql
  6. Affinity Publisher for Mac排版设计工具
  7. Struts 2.2.3 DOS漏洞
  8. 让PPT设计更出彩的技巧都有哪些?
  9. Android动态生成答题卡,好分数怎样制作答题卡
  10. 专用于个人简历的latex模板
  11. 计算机应用技术新生入学感想,大学新生入学心得体会范文(精选9篇)
  12. 古人用计算机计算图片,人类最早的计算器《算表》如何帮助古人完成计算?
  13. html字体制作,用@font-face实现网页特殊字符(制作自定义字体)
  14. 通过.frm和.idb文件恢复mysql数据库
  15. FPGA 11 基础 8421BCD码
  16. NSA方程式泄漏工具包浅析
  17. 《2023游戏行业热点趋势报告》|Party Game游戏成为新趋势,备受消费者瞩目
  18. HarmonyOS开发-路由组件体验
  19. 周大福守护一生 | 在520奔赴一场终身浪漫的约会
  20. 第1次作业:软件工程之计算机生涯序言

热门文章

  1. Python跨文件引用模块
  2. 完美解决Mac电脑睡眠之后苹果电脑没有声音的方法
  3. fcpx大胆流行标题插件 Bold Pop for mac
  4. go爬虫和python爬虫_爬虫练手-豆瓣top250(go版以及python版)
  5. 省选+NOI 第八部分 数论
  6. 【原型设计】第三节:Axure RP9 母版的使用说明以及操作教程
  7. wamp 配置 mysql_PHPWAMP配置应该如何修改,Web服务器、php、mysql的具体配置修改
  8. oracle orapath,SQLNET.ORA中的NAMES.DIRECTORY_PATH设置
  9. cuda笔记-第一个cuda程序
  10. Qt笔记-Q3DScatter中元素的移动和旋转