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

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

相关文章

深入理解Go语言中二维切片的使用

《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态

Java中的数组与集合基本用法详解

《Java中的数组与集合基本用法详解》本文介绍了Java数组和集合框架的基础知识,数组部分涵盖了一维、二维及多维数组的声明、初始化、访问与遍历方法,以及Arrays类的常用操作,对Java数组与集合相... 目录一、Java数组基础1.1 数组结构概述1.2 一维数组1.2.1 声明与初始化1.2.2 访问

MySQL中查找重复值的实现

《MySQL中查找重复值的实现》查找重复值是一项常见需求,比如在数据清理、数据分析、数据质量检查等场景下,我们常常需要找出表中某列或多列的重复值,具有一定的参考价值,感兴趣的可以了解一下... 目录技术背景实现步骤方法一:使用GROUP BY和HAVING子句方法二:仅返回重复值方法三:返回完整记录方法四:

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

基于 HTML5 Canvas 实现图片旋转与下载功能(完整代码展示)

《基于HTML5Canvas实现图片旋转与下载功能(完整代码展示)》本文将深入剖析一段基于HTML5Canvas的代码,该代码实现了图片的旋转(90度和180度)以及旋转后图片的下载... 目录一、引言二、html 结构分析三、css 样式分析四、JavaScript 功能实现一、引言在 Web 开发中,

一文深入详解Python的secrets模块

《一文深入详解Python的secrets模块》在构建涉及用户身份认证、权限管理、加密通信等系统时,开发者最不能忽视的一个问题就是“安全性”,Python在3.6版本中引入了专门面向安全用途的secr... 目录引言一、背景与动机:为什么需要 secrets 模块?二、secrets 模块的核心功能1. 基

MySQL JSON 查询中的对象与数组技巧及查询示例

《MySQLJSON查询中的对象与数组技巧及查询示例》MySQL中JSON对象和JSON数组查询的详细介绍及带有WHERE条件的查询示例,本文给大家介绍的非常详细,mysqljson查询示例相关知... 目录jsON 对象查询1. JSON_CONTAINS2. JSON_EXTRACT3. JSON_TA