发现还是数组这种最简单的编码才适合我,遇到树,链表这些真的是一头雾水,自己也不知道怎么实现。言归正传,该篇文章介绍如何求旋转数组的最小值,求最大值可以适当改编即可。

什么是旋转数组呢,就是将一个数组的前几个元素和后面几个元素互换位置。例如原数组(升序的数组)为{0,1,2,3,4,5,6,7,8,9},将其旋转后变为{5,6,7,8,9,0,1,2,3,4}。如何求该数组的最小值呢,有一种方法是直接按顺序比较,但是这就体现不出旋转数组的特性了,所以更好的解法应该是采用二分法来求得该数组的最小值。我们可以发现在旋转数组中9坐标的数都比它小,右边的数也都比它小。我们设有2个指针,左指针指向最左边的元素,右指针指向最右边的元素。我们判断中间的元素和最左边元素的大小,如果中间的数大于左指针指向的元素,证明最小的数字在中间数字的右边。这样我们就可以缩小范围啦。

代码如下

#include<iostream>
#include<cstdlib>
#include <stack>
#include <stdio.h>
#include<time.h>using namespace std;int Min(int a[], int length)
{if (a == nullptr || length <= 1)       //如果出现数组中只有一个元素的就直接报错吧throw new exception("Invalid parameters");int left = 0;int right = length - 1;while (a[left] > a[right])           {if (right <= left+2)             //数组中有2个或者三个元素,最右边的元素都是最小的return a[right];int mid = (left + right) / 2;if (a[mid] >= a[left])left = mid;else if (a[mid] < a[right])right = mid;}return a[right];
}int main()
{int a[] = { 44,45,46,1,2,3,15,33,41 };int min=Min(a, 6);cout << min << endl;system("pause");}

不过很显然这种方法不是很完善的,因为没有考虑一种比较特殊的情况,就是数组中拥有重复元素的时候。比如数组{1,1,1,0,1},{1,0,1,1,1}。这种时候就只能选择顺序查找的办法啦。

改进代码如下:

#include<iostream>
#include<cstdlib>
#include <stack>
#include <stdio.h>
#include<time.h>using namespace std;int MinInOder(int a[], int left,int right)
{int result = a[left];for (int i = left+1; i < right; i++){if (a[i] < result)result = a[i];}return result;
}int Min(int a[], int length)
{if (a == nullptr || length <= 1)throw new exception("Invalid parameters");int left = 0;int right = length - 1;while (a[left] >=a[right]){if (right <= left+2)return a[right];int mid = (left + right) / 2;if (a[right] == a[left]&& a[mid] == a[right])return MinInOder(a, left,right);if (a[mid] >= a[left])left = mid;else if (a[mid] <= a[right])right = mid;}return a[right];
}int main()
{int a[] = { 1,1,1,1,0,1,1,1,1 };int min=Min(a, 6);cout << min << endl;system("pause");}

求旋转数组的最小数字C++相关推荐

  1. 算法练习day20——190411(重建二叉树、斐波那契数列、跳台阶、矩形覆盖、变态跳台阶、旋转数组的最小数字、矩阵中的路径)

    1.重建二叉树 根据二叉树的前序遍历和中序遍历的结果,重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字. preorder = [3,9,20,15,7].inorder = [9 ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. 《剑指offer》— JavaScript(6)旋转数组的最小数字

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

最新文章

  1. 清华阿里联合发布:一个Few-shot场景的命名实体识别数据集
  2. 6万车主使用智能驾驶不给钱,理想汽车竟然还说越多越好?
  3. mysql半备份_MySQL半同步复制与增强半同步复制详解及安装
  4. 关于iOS知识的提升
  5. operator-sdk实战开发K8S CRD自定义资源对象
  6. Size Balanced Tree
  7. linux下部署Tesseract OCR及调用
  8. Tomcat监控利器Probe
  9. IOS UI TabBar标签栏的使用
  10. 离散数学思维导图 - 集合论,命题逻辑,谓词逻辑,二元关系,特殊关系,图论,树
  11. ip纯真数据库查询国家省市名称
  12. Java项目--网页版音乐播放器(JQuery前端逻辑)
  13. 爬取B站前两千位up主的粉丝数
  14. DownloadHelper使用教程
  15. openairinterface5g基站老版eNB部署
  16. jsp显示中文文件名的图片 详细出处参考:http://www.jb51.net/article/37149.htm
  17. btrace 开源!基于 Systrace 高性能 Trace 工具
  18. SISD、MIMD、SIMD、MISD系统介绍
  19. 【Java学习】JUC并发编程
  20. phpyun 电脑调试wap版

热门文章

  1. java3n 1_1005 继续(3n+1)猜想(JAVA)
  2. 怎么找到项目中所有同名的类_26岁转行程序员的成长历程--Day03从内存层面理解类和对象...
  3. 嵌入式开发linux工具,嵌入式Linux开发入门之MfgTool工具的使用
  4. java继承与覆盖_简单的继承,方法重载与方法覆盖
  5. java内存四大区,jvm基础-内存区域
  6. 美少女什么味??竟然还有美少女风味泡面......
  7. 在床上玩手机,千万不能把手机放下!
  8. 5分钟盗走你的隐私照片,这个全球性漏洞到底有多可怕
  9. linux 系统迁移到固态硬盘,把Debian GNU/Linux迁移到SSD上
  10. php 建立自己的框架,利用 Composer 一步一步构建自己的 PHP 框架(一)——基础准备...