博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
6、旋转数组的最小位置------------>剑指offer系列
阅读量:4958 次
发布时间:2019-06-12

本文共 1303 字,大约阅读时间需要 4 分钟。

题目

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

NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。

基本思路

肯定不能直接遍历,失去了这道题的意义

旋转数组其实是由两个有序数组拼接而成的,因此我们可以使用二分法,只需要找到拼接点即可。

(1)array[mid] > array[high]:

出现这种情况的array类似[3,4,5,6,0,1,2],此时最小数字一定在mid的右边。 low = mid + 1

(2)array[mid] == array[high]:

出现这种情况的array类似 [1,0,1,1,1] 或者[1,1,1,0,1],此时最小数字不好判断在mid左边 还是右边,这时只好一个一个试 。 high = high - 1

(3)array[mid] < array[high]:

出现这种情况的array类似[2,2,3,4,5,6,6],此时最小数字一定就是array[mid]或者在mid的左 边。因为右边必然都是递增的。 high = mid

代码

function minNumberInRotateArray(arr)
{
let len = arr.length;
if(len == 0) return 0;
let low = 0, high = len - 1;
while(low < high) {
let mid = low + Math.floor((high-low)/2);
if(arr[mid] > arr[high]) {
low = mid + 1;
} else if(arr[mid] == arr[high]) {
high = high - 1;
} else {
high = mid;
}
}

return arr[low];

}

扩展
二分查找

function binarySearch(data, arr, start, end) {        if (start > end) {            return -1;        }        var mid = Math.floor((end + start) / 2);        if (data == arr[mid]) {            return mid;        } else if (data < arr[mid]) {            return binarySearch(data, arr, start, mid - 1);        } else {            return binarySearch(data, arr, mid + 1, end);        }    }

转载于:https://www.cnblogs.com/QianDingwei/p/10896496.html

你可能感兴趣的文章
image -- pmp
查看>>
SVN&nbsp;被防火墙阻止的解决方法
查看>>
2018高级软件工程——助教总结
查看>>
初次接触scrapy框架
查看>>
Spring对注解(Annotation)处理源码分析1——扫描和读取Bean定义【转】
查看>>
[python]类与类中的列表
查看>>
gulp基本介绍
查看>>
将GraphicalViewer导出为图片
查看>>
内置函数大总结
查看>>
SQL权威指南(第4版)pdf
查看>>
非受检异常(运行时异常)和受检异常的区别等
查看>>
2007年的第一篇
查看>>
webView和js交互
查看>>
android studio 下载地址
查看>>
java小游戏的初步学习笔记
查看>>
ABAP:更新供应商Email地址
查看>>
好用的 diskpart 命令,操作磁盘分区,并创建 EFI 引导分区
查看>>
在腾讯实习的那段日子:不要在难受的时候选择逃避离开
查看>>
能被N整除的数字的特征(数学知识点)
查看>>
Zend Framework 2.1.5 中根据服务器的环境配置调用数据库等的不同配置
查看>>