Day 6:旋转数组的最小数字
剑指Offer_编程题——旋转数组的最小数字
题目描述:
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1.NOTE:给出的所有元素都大于0,若数组大小为0,请返回0.
具体要求:
时间限制: C/C++ 3秒,其他语言6秒 空间限制: C/C++32M,其他语言64M
具体思路:
思路1:二分查找(折半查找)+递归算法 根据题意可知,数组是非递减的,是有序的,最适合的就是二分查找了 当array[mid]>array[left]时,最小的数必定在min的右侧 当array[mid]<array[left]时,最小的数必定在min的左侧 当array[mid]=array[left]时,最小的数不能确定是在左还是在右,这时候,我们不妨直接将left向右移动一位( 当然也可以向左)。 具体我们分别用java和python来实现这一思路 1、首先我们用java来实现
import java.util.Arrays;
public class Solution {
public int minNumberInRotateArray(int [] array) {
//二分查找
int left=0;
int right=array.length-1;
int mid=(left+right)/2;
if(array.length==2) {
return array[0]<array[1]?array[0]:array[1];
}
if(array.length==1) {
return array[0];
}
if(array[mid]>array[left]){
return minNumberInRotateArray(Arrays.copyOfRange(array,mid,array.length));
}else if(array[mid]<array[left]){
return minNumberInRotateArray(Arrays.copyOfRange(array,0,mid+1));
}else{
return minNumberInRotateArray(Arrays.copyOfRange(array,1,array.length));
}
}
}
其效果如图所示:
2、接下来用python将其实现
class Solution:
def minNumberInRotateArray(self, rotateArray):
if len(rotateArray) == 0:
return 0
left = 0
right = len(rotateArray) - 1
while (left < right):
if rotateArray[left] < rotateArray[right]:
return rotateArray[left]
mid = left + (right - left) // 2
if rotateArray[left] < rotateArray[mid]:
left = mid + 1
elif rotateArray[mid] < rotateArray[right]:
right = mid
else:
left = left + 1
return rotateArray[left]
其效果如图所示:
思路2 分析数组的特点可知,发现数组非递减,若突然变小,在非递减,则可知突然变小的值即为最小值。 我们用java实现该思路:
import java.util.Arrays;
public class Solution{
public int minNumberInRotateArray(int [] array){
if(array.length == 1){
return array[0];
}
if(array == null || array.length == 0){
return 0;
}
for (int i = 0; i < array.length - 1; i++){
if(array[i] > array[i + 1]){
return array[i + 1];
}
else{
if(i == array.length - 2){
return array[0];
}
}
}
return 0;
}
}
其效果如图所示:
class Solution:
def minNumberInRotateArray(self, rotateArray):
if len(rotateArray) == 0:
return 0
res_min = 100000000000000000;
for i in range(len(rotateArray) - 1):
j = i + 1
if rotateArray[i] > rotateArray[j] and rotateArray[j] < res_min:
res_min = rotateArray[j]
return res_min
其效果如图所示:
总结
本道题主要考察查找,在做题之前,我们应该了解几种常用的查找方法,比如:二分查找、散列表、二叉查找树、平衡二叉树等,当然也要掌握递归算法,俗话说“大神用递归,一般人用迭代”。一般数据结构是最重要的,要把所有的算法融会贯通,这道题就是将递归和二分查找的有序结合,前道题是栈与队列的结合,因此,我们要更加的掌握各种算法,只有这样才能在遇到各种算法相结合的时候,才能想到相应的算法。继续加油,争取早日找到工作,Good Luck!!!
参考文献
本代码主要参考了以下的博客: [1] 好好学习_天天向上de [2] 小小Java人
- 关于session leak的问题分析(r3笔记第13天)
- 执行计划的偏差导致的性能问题(r3笔记第12天)
- 关于评审开发人员的sql语句(r3笔记第11天)
- 性能下降的不定时炸弹_过旧的sql_profile(r3笔记第9天)
- 关于抓取session信息的一个脚本(r3笔记第8天)
- oracle PL/SQL中的重载 (r3笔记27天)
- 使用Python进行描述性统计
- 关于修改分区表的准备和操作细则(r3笔记26天)
- 一条"简单"的sql语句和小兔子买面包的故事 (r3笔记第25天)
- 生产环境sql语句调优实战第八篇(r3笔记第24天)
- Python做文本挖掘的情感极性分析
- 通过vmstat的简单分析数据库操作 (r3笔记23天)
- 海量数据迁移之一个误操作的问题总结(r3笔记第21天)
- 关于dblink锁定带来的问题(r3笔记第20天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- laravel 实现根据字段不同值做不同查询
- php实现获取近几日、月时间示例
- PHP+redis实现微博的拉模型案例详解
- PHP实现微信申请退款功能
- Laravel+Intervention实现上传图片功能示例
- 关于laravel框架中的常用目录路径函数
- Java byte数组操纵方式代码实例解析
- php桥接模式应用案例分析
- PHP设计模式之中介者模式(Mediator Pattern)入门与应用案例详解
- laravel 出现command not found问题的解决方案
- PHP怎么搭建百度Ueditor富文本编辑器
- 使用composer命令加载vendor中的第三方类库 的方法
- PHP批斗大会之缺失的异常详解
- Laravel 6.2 中添加了可调用容器对象的方法
- php实现微信企业转账功能