《剑指offer》旋转数组中的最小数字
本题来自《剑指offer》 旋转数组中的最小数字
题目:
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
思路:
从问题本身入手,可以看出,数据局部有序,思考数据中是否重复。属于查找范畴,顺序查找肯定可以,需要O(n)时间,数据有序可以考虑二分查找为log(n)时间内。
若数据不重复:二分法查找
可以局部看成两个有序的数组A、B。p1指向首,p2指向尾:
如果中间值大于p1的值,说明最小值在B中,将p1指向中间值。
如果中间值小于p2的值,说明最小值A中,将p2指向中间值。
如果中间值和p1和p2的值相等,则采用下面的方法,顺序查找。
终止条件是,当p1和p2相邻,最小值便是p2指向的值。返回即可
若数据重复:顺序查找
假设第一个为最小的元素,开始遍历,后面凡是小于该值的便保存,最后返回。
C++ Code:
- class Solution {
- public:
- int minNumberInRotateArray(vector<int> rotateArray) {
- int p1 = 0;
- int p2 = rotateArray.size()-1;
- int mid = p1;
- while (rotateArray[p1] >= rotateArray[p2]){ //循环条件首值应该大于后值
- if (p2 - p1 == 1){ //当首尾相邻时候
- mid = p2; //那么最小值是p2的方向
- break;
- }
- mid = (p1 + p2)/2; //中间值为加权平均
- if (rotateArray[mid]==rotateArray[p1]&&rotateArray[mid]==rotateArray[p2]){
- return minInorder(rotateArray); //如果三值相等,则采用顺序查找法
- }
- if (rotateArray[mid] >= rotateArray[p1]){ //如果中间值大于首值,说明最小值在后面的数组中
- p1 = mid; //手指针后移
- }
- else if (rotateArray[mid] <= rotateArray[p2]){ //如果中间值小于末值,说明最小值在前面的数组中
- p2 = mid; //将末值前移
- }
- }
- return rotateArray[mid];
- }
- int minInorder(vector<int> rotateArray){ //顺序查找法为O(n)
- int result = rotateArray[0]; //假设最小值是首值
- for (int i = 1;i<rotateArray.size();i++){
- if (result >= rotateArray[i]){ //如果当找到小于该值时候,便保存
- result = rotateArray[i];
- }
- }
- return result;
- }
- };
Python Code:
- # -*- coding:utf-8 -*-
- class Solution:
- def minNumberInRotateArray(self, rotateArray):
- # write code here
- p1 = 0 #首地址
- p2 = len(rotateArray)-1 #尾地址
- mid = p1 #起初直接将第一个元素作为中间值,如果第一个值小于最后一个值,便直接返回
- while rotateArray[p1] >= rotateArray[p2]: #循环条件是,起始的值大于末值
- if p2 - p1 == 1: #终止条件是,当起始和末值相邻近
- mid = p2 #将末值赋给中间返回
- break
- mid = (p1 + p2) // 2 #中间值是首末加权平均,python3中//是整除
- if rotateArray[mid] == rotateArray[p1] and rotateArray[mid] == rotateArray[p2]:
- return self.minInorder(rotateArray) #当三个值全部相等时候,说明有重复的值,采用顺序查找
- if rotateArray[mid] >= rotateArray[p1]: #当中间值大于首值时候,说明最小值在后面的数组中
- p1 = mid #便将首地址后移
- elif rotateArray[mid] <= rotateArray[p2]: #如果中间值小于末值时候,说明最小值在前面的数组中
- p2 = mid #便将末值前移
- return rotateArray[mid] #其中间值便是最小的值
- def minInorder(self,rotateArray): #顺序查找代码
- result = rotateArray[0] #假设第一个值是最小值
- if len(rotateArray): #特殊测试,测试是否为空
- for i in range(len(rotateArray)-1):
- if rotateArray[i] > rotateArray[i+1]: #将小于它的值保存起来
- result = rotateArray[i+1]
- break
- return result
总结:
从问题本身入手,明确要处理的问题是什么,要求什么样,时间和空间如何转换。以求最优。
《剑指offer》旋转数组中的最小数字的更多相关文章
- 剑指 Offer 03. 数组中重复的数字
剑指 Offer 03. 数组中重复的数字 找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知 ...
- 菜鸟刷题路:剑指 Offer 03. 数组中重复的数字
剑指 Offer 03. 数组中重复的数字 哈希表/set class Solution { public int findRepeatNumber(int[] nums) { HashSet< ...
- 5.1 剑指 Offer 03. 数组中重复的数字
类型题:剑指 Offer 03. 数组中重复的数字 找出数组中重复的数字.在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了, ...
- Go语言实现:【剑指offer】数组中重复的数字
该题目来源于牛客网<剑指offer>专题. 在一个长度为n的数组里的所有数字都在0到n-1的范围内.数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组 ...
- (python)剑指Offer:数组中重复的数字
问题描述 在长度为n的数组中,所有的元素都是0到n-1的范围内. 数组中的某些数字是重复的,但不知道有几个重复的数字,也不知道重复了几次,请找出任意重复的数字. 例如,输入长度为7的数组{2,3,1, ...
- [剑指offer]3.数组中的重复数字
3.数组中的重复数字 题目 找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了 ...
- 【剑指Offer】数组中重复的数字 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 解题方法 Set 快慢指针 日期 题目地址:https://leetcod ...
- 剑指Offer 50. 数组中重复的数字 (数组)
题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为 ...
- 剑指offer:数组中重复的数字
题目描述: 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度 ...
- [剑指Offer] 50.数组中重复的数字
题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为 ...
随机推荐
- angular-file-upload 项目实践踩坑
API文档: https://github.com/nervgh/angular-file-upload/wiki/Module-API 过程中得到昊哥的鼎力帮助,感谢. 需求如下,分别选择多个文件, ...
- 今天碰到一个问题,怎么限制用户在固定宽度的input输入框里输入的长度,由此涉猎到了maxlength属性和size属性以及它们的区别。
最开始想首先要强制在一行,另外超出的隐藏.还有一个思路是把value的值的长度和框的长度怎么联系起来,具体怎么联系我也不知道. 在解决另外一个问题的时候,哥发给我的代码里无意中看见input有个max ...
- linux 进程间同步互斥
参考链接: https://www.oschina.net/code/snippet_237505_8646 http://www.cnblogs.com/xilentz/archive/2012/1 ...
- 如何在 JS 中嵌入大量 HTML 代码 --更新2017-10-10 16:37:09
一.一般方式 方式1:\ 要写在标签后面,看例子 var longString = "\ ------------------------\ ------------------------ ...
- Maven项目在更新过程停止,再更新无效-->解决
---类似网友问题:但我按照这样无法解决. eclipse中maven项目jar包不会自动下载解决办法 - wavemelody - 博客园http://www.cnblogs.com/mymelod ...
- java.lang.RuntimeException: Cannot create a secure XMLInputFactory 异常处理
背景:本人在近日的webservice CXF接口的编写调试过程中,发现一个很奇怪的现象--我在本地对接口进行往返请求时完全没有问题,不管是main方法直接调用还是业务场景里调用都无问题,在其他同 ...
- bash常用指令(未完)
#号注释1.man 2.cd 3.clear 4.alias 命令别名设置 区别命令别名和变量的区别,别名可以直接执行,本质是一个函数的索引 5.grep 查找字符串 grep [-acinv] [- ...
- oracle 索引的创建与使用
什么是数据库索引 在关系数据库中,索引是一种与表有关的数据库结构,它可以使对应于表的SQL语句执行得更快. 索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容. 对于数据库来说,索引是 ...
- 关于softmax、argmax、softargmax
在阅读LIFT:Learned Invariant Feature Transform一文时,文中第1节提到为了保证端到端的可微性,利用softargmax来代替传统的NMS(非极大值抑制)来挑选极值 ...
- dubbo源码分析14——DubboProtocol的export方法分析
走到了这一步也挺不容易的,把之前的暴露入口代码再列出来回顾一下: //配置为none不暴露 if (! Constants.SCOPE_NONE.toString().equalsIgnoreCase ...