专栏名称: 吴师兄学算法
和程序员小吴一起从初学者的角度学习算法,以动画的形式呈现解题的思路。每周四篇原创文章,期待你的鉴赏!
目录
相关文章推荐
河南省发改委  ·  互动H5丨玩游戏,领奖品,豫见开门红! ·  18 小时前  
销售与市场  ·  “消费降级”是谎言!年轻人都在偷偷花钱 ·  昨天  
销售与市场  ·  胖东来官宣入郑:“神仙打架” ... ·  2 天前  
C2CC新传媒  ·  将女性话题简化为营销噱头,SK-II真诚度“ ... ·  2 天前  
51好读  ›  专栏  ›  吴师兄学算法

剑指Offer 图解 | 寻找旋转排序数组中的最小值

吴师兄学算法  · 公众号  ·  · 2020-01-18 12:15

正文

点击上方 蓝字 设为星标

下面开始今天的学习~

今天分享的题目来源于 LeetCode 上第 153 号问题:寻找旋转排序数组中的最小值。也是《剑指Offer》上的一道经典题。

题目描述

假设按照升序排序的数组在预先未知的某个点上进行了旋转。

( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。

请找出其中最小的元素。

你可以假设数组中不存在重复元素。

示例 1 :

输入: [3,4,5,1,2]
输出: 1

示例 2:

输入: [4,5,6,7,0,1,2]
输出: 0

题目解析

这道题目最简单粗暴的方式就是 直接遍历 整个数组来寻找,这个方法的时间复杂度为 O(N) ,空间复杂度为 O(1)

不过,这样来做的话完全没有利用到题目给出一个条件 旋转

事实上,可以考虑将时间复杂度从 O(n) 缩小到 O(lgn) ,这时候 二分查找法 就浮现在脑海。

当然,这里是 二分查找法 的一种变体。

更多有关二分查找法的文章点击这篇: 一网打尽!二分查找解题模版与题型全面解析

二分的方法可以保证每次比较后,去掉数组中一半的元素。

这道题目中可以将 中点 终点 进行比较。

  • mid end:最小值在左半部分。

  • mid > end :最小值在右半部分。

也就是说只需要把 mid 和 end 比较,mid < end 丢弃右半部分(更新 end = mid),mid > end 丢弃左半部分( 更新 start = mid + 1 )。

直到 end 等于 start 时候结束就可以了。

补充 :之所以这里 更新 start = mid + 1 而不是 start = mid 是因为存在一种特殊情况。当数组只剩两个元素的时候, mid = (start + end)/ 2 mid 取的就是 start 。然后如果此时 mid > end ,会发现 start 的位置不会变化,出现 死循环 。(可以通过以下动画加深理解)

动画描述

代码实现

//author:程序员吴师兄
//source:图解面试算法






请到「今天看啥」查看全文