求旋转数组的最小数字——二分查找算法的深入理解

2024-05-07 18:18

本文主要是介绍求旋转数组的最小数字——二分查找算法的深入理解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

没想到啊,没想到,面试第一家互联网企业的时候,就是这一问题。之前又看到过这个题型,但是没有自己动手写过代码,所以花了一些时间才想出思路来,真是汗颜。在这里重新做一下思路总结。

二分查找算法,针对一个有序的数组,可以有O(log2n)的时间复杂度。那对于相对有序的数组,比如旋转数组,array1[]={4,5,1,2,3},这种情况下如何查找数组当中的最小值?

思路:其实还是用二分查找的思路,如果二分查找的两个指针两头就是指向一个排序的数组,那就好办了。那两个指针之间不是排序的呢?那就调整其中一个指针使得他们两个之间的数组是排序的。就是说先判断旋转数组头和尾的数的大小,那边大就调整哪边的指针,比如,如果左边的大,那么将左边的指针往右移,移多少呢,移一半(left+right)/2个单位。如果右边大,那就移动右边的指针一半的单位,知道两个指针指向相邻的两个元素时,在比较左右两个元素谁最小。返回下标值,结束。


点评:1二分查找法;2分析能力;3还是要把情况想完整,想清楚。

// FindMinofRotatedArray.cpp : 定义控制台应用程序的入口点。
/*@mishidemudong@2015-6-2-10:27
*/
//#include "stdafx.h"int Min(int * numbers, int length)
{if (numbers == NULL || length <= 0)return -1;int first = 0;int end = length-1;int mid = first;while (numbers[first] >= numbers[end]){if ((end - first == 1)||(first-end==1))//注意end会跑到first前面,所以这里的条件是两个;{mid = end;break;}mid = (first + end) / 2;if (numbers[mid] >= numbers[first])first = mid;else if (numbers[mid] <= numbers[first])end = mid;}return mid;
}int _tmain(int argc, _TCHAR* argv[])
{int result1 = 0;int result2 = 0;int result3 = 0;int result4 = 0;int array1[] = {  5, 1, 2 ,3, 4 };int array2[] = { 1, 2, 3, 4, 5 };int array3[] = { 4, 5, 1, 2, 3 };int array4[] = { 3, 4, 5, 1, 1 };result1 = Min(array1, 5);result2 = Min(array2, 5);result3 = Min(array3, 5);result4 = Min(array4, 5);for (int i = 0; i < 5; ++i)printf("%d  ", array1[i]);printf("\n%d\n  ", result1);for (int i = 0; i < 5; ++i)printf("%d  ", array2[i]);printf("\n%d\n ", result2);for (int i = 0; i < 5; ++i)printf("%d  ", array3[i]);printf("\n%d\n", result3);for (int i = 0; i < 5; ++i)printf("%d ", array4[i]);printf("\n%d\n", result4);return 0;}


这篇关于求旋转数组的最小数字——二分查找算法的深入理解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/968027

相关文章

Java数组动态扩容的实现示例

《Java数组动态扩容的实现示例》本文主要介绍了Java数组动态扩容的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1 问题2 方法3 结语1 问题实现动态的给数组添加元素效果,实现对数组扩容,原始数组使用静态分配

Python结合Free Spire.PDF for Python实现PDF页面旋转

《Python结合FreeSpire.PDFforPython实现PDF页面旋转》在日常办公或文档处理中,我们经常会遇到PDF页面方向错误的问题,本文将分享如何用Python结合FreeSpir... 目录基础实现:单页PDF精准旋转完整代码代码解析进阶操作:覆盖多场景旋转需求1. 旋转指定角度(90/27

GO语言zap日志库理解和使用方法示例

《GO语言zap日志库理解和使用方法示例》Zap是一个高性能、结构化日志库,专为Go语言设计,它由Uber开源,并且在Go社区中非常受欢迎,:本文主要介绍GO语言zap日志库理解和使用方法的相关资... 目录1. zap日志库介绍2.安装zap库3.配置日志记录器3.1 Logger3.2 Sugared

深入理解Redis线程模型的原理及使用

《深入理解Redis线程模型的原理及使用》Redis的线程模型整体还是多线程的,只是后台执行指令的核心线程是单线程的,整个线程模型可以理解为还是以单线程为主,基于这种单线程为主的线程模型,不同客户端的... 目录1 Redis是单线程www.chinasem.cn还是多线程2 Redis如何保证指令原子性2.

深入理解MySQL流模式

《深入理解MySQL流模式》MySQL的Binlog流模式是一种实时读取二进制日志的技术,允许下游系统几乎无延迟地获取数据库变更事件,适用于需要极低延迟复制的场景,感兴趣的可以了解一下... 目录核心概念一句话总结1. 背景知识:什么是 Binlog?2. 传统方式 vs. 流模式传统文件方式 (非流式)流

深入理解Go之==的使用

《深入理解Go之==的使用》本文主要介绍了深入理解Go之==的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录概述类型基本类型复合类型引用类型接口类型使用type定义的类型不可比较性谈谈map总结概述相信==判等操作,大

深入理解Mysql OnlineDDL的算法

《深入理解MysqlOnlineDDL的算法》本文主要介绍了讲解MysqlOnlineDDL的算法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小... 目录一、Online DDL 是什么?二、Online DDL 的三种主要算法2.1COPY(复制法)

JavaScript对象转数组的三种方法实现

《JavaScript对象转数组的三种方法实现》本文介绍了在JavaScript中将对象转换为数组的三种实用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友... 目录方法1:使用Object.keys()和Array.map()方法2:使用Object.entr

linux查找java项目日志查找报错信息方式

《linux查找java项目日志查找报错信息方式》日志查找定位步骤:进入项目,用tail-f实时跟踪日志,tail-n1000查看末尾1000行,grep搜索关键词或时间,vim内精准查找并高亮定位,... 目录日志查找定位在当前文件里找到报错消息总结日志查找定位1.cd 进入项目2.正常日志 和错误日

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2