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

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比较和交换示例 - CAS算法

Java比较和交换示例 - CAS算法 由Lokesh Gupta | 提起下:多线程 一个Java 5中最好添加的是支持类,如原子操作AtomicInteger,AtomicLong等等。这些课程帮助您最大限度地减少复杂的(非必要)需要多线程的,如增加一些基本的操作代码或递减的值在多个线程之间共享。这些类内部依赖于名为CAS(比较和交换)的算法。在本文中,我将详细讨论这个概念。 1.乐观和

Java内存管理 - 垃圾收集算法

我们都知道Java 中垃圾收集器 [GC] 的功能。但只有少数人试图深入了解垃圾收集的工作原理。你不是其中之一,这就是你在这里的原因。 在这个Java内存管理教程中,我们将尝试了解Java垃圾收集的当前算法,我们将了解这些算法的演变。 目录1. Java中的内存管理2.引用计数机制3.标记和清除机制4.停止并复制GC 5.分代停止和复制6.如何提高Java中的内存利用率 1.

java后台DecimalFormat处理数字,3位加逗号分隔

package com.zhong;import java.math.BigDecimal;import java.text.DecimalFormat;/*** 给数字每三位加一个逗号工具类* @author admin**/public class DecimalFormatUtil {public static final String DEFAULT_FORMAT = "#,###.

MySql删除重复数据只保留最小id的那条数据。某某公司的临时面试题

错误代码: DELETE FROMpayment WHEREserial IN ( SELECT serial FROM payment GROUP BY serial HAVING count(*) > 1 ) AND id NOT IN ( SELECT min( id ) AS id FROM payment GROUP BY serial HAVING count( serial )

关于Java的数组的使用

关于一维数组的使用 代码示例一如下: package com;public class test_array {public static void main(String[] args){//1.如何定义 一个 数组//1.1数组的声明String[] names;int[] scores;//1.2数组的初始化://1.2.1静态初始化:初始化数组与数组元素赋值同时进行nam

数字信封(RSA和DES整合测试)加密技术

http://git.oschina.net/xshuai/ai 源码地址 DES加解密方法 package com.xs.demo.util;import java.security.SecureRandom;import javax.crypto.Cipher;import javax.crypto.SecretKey;import javax.crypto.SecretKey

DoNet:浅淡对delegate的理解

1 前言 C#的相关文档,MSDN上其实已经很详细了,关于delegate的使用可以参 考MSDN上的文档https://msdn.microsoft.com/zh-cn/library/900fyy8e.aspx 2 官方示例 委托类型的声明与方法签名相似, 有一个返回值和任意数目任意类型的参数: public delegate void TestDelegate(string mes

有感FOC算法学习与实现总结

文章目录 基于STM32的有感FOC算法学习与实现总结1 前言2 FOC算法架构3 坐标变换3.1 Clark变换3.2 Park变换3.3 Park反变换 4 SVPWM5 反馈部分5.1 相电流5.2 电角度和转速 6 闭环控制6.1 电流环6.2 速度环6.3 位置环 写在最

算法的设计方式

1.贪心算法 贪心算法(又称贪婪算法)是指在对问题求解时,从问题的某一个初始解出发,总是做出在当前看来最好的选择,当达到某算法中的某一步不能再继续前进时,算法停止。这时,就得到了问题的一个解,但不能保证求得的最后解是最优的。也就是说,不从整体最优上加以考虑,它所做出的仅是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题能产生整体最优解或者是整体最优解

冒泡算法及改进(属于交换排序)

冒泡排序(Bubble Sort)是一种交换排序,快速排序也属于一种交换排序。冒泡排序的基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。 假设一共共有 n 个数,则会进行 (n-1)趟比较,由1,2......n-1这么多趟,第一趟进行 (n-1)次比较,.......第n-1趟进行1次比较,故有公式:第i趟 +  第i趟的比较次数 = n       时间复杂度为