20.5.14 搜索旋转排序数组

今天做的题是搜索旋转排序数组,题目如下:

假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。你可以假设数组中不存在重复的元素。你的算法时间复杂度必须是 O(log n) 级别。

一开始看到这个题不懂复杂度,就直接用indexOf解决了,居然也让我过了,后来看了以下评论说这样复杂度不对,得用二分法,就又写了一个二分法的。代码如下:


后来看了人家的解析才知道我还是不太理解旋转,这里的旋转是从头截取一段直接放到后面而不是可以从中间截,或是插入到中间即不会出现[4,5,0,1,2,6,7]这种情况,所以我这个代码比别人的麻烦些。

看了人家的解法,就是判断mid是在有序还是无序的那段。假如mid小于start,则mid一定在右边有序部分。

假如mid大于等于start, 则mid一定在左边有序部分。我们只需要比较target和有序部分的边界关系就行了。在这里感谢一下作者的代码分析和分享,下面是链接(作者:fe-lucifer链接:https://leetcodecn.com/problems/search-in-rotated-sorted-array/solution/pythonjs-er-fen-fa-33-sou-suo-xuan-zhuan-pai-xu-sh/)

下面是代码的截图:


学习了下二分搜索法,就是在有序数组中查找特定元素,注意是有序数组。算法思路是先拿中间的那个和目标进行比较相等就返回,如果target > mid 就在后面那段中寻找,如果target < mid 就在前面那段寻找。二分查找法有两种写法一种是非递归另一种就是递归。



好了今天这道题的学习就到这里。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。