博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LeetCode: Search in Rotated Sorted Array I & II
阅读量:4619 次
发布时间:2019-06-09

本文共 1022 字,大约阅读时间需要 3 分钟。

首先要注意二分法。

二分法的终止条件是:low > high,而不是low >= high。因为在某些情况下,low == high的下一步就是就是low > high,而low == high恰是范围缩小到一个元素的情况。

二分法的更新操作。是将mid-1赋值给high,或者将mid+1赋值给low。而不是mid赋值给high或low。当只有2个元素的时候,会形成无线循环。所以每次要缩小范围。

 

这道题一共做了三种算法。第一种是用二分法先找到数组中的最大元素,确定两段数组分别的位置。然后再根据target的大小确定它在哪个范围内,进而在其中一段再进行二分查找。

存在的问题是,找最大元素不能在完全顺序的条件下找到,比如1,2,3,4就无法确定最大元素,但是不影响结果,因为还要确定target范围,所以在完全顺序的条件下,无论确定那个是最大元素都不影响结果。

 

第二种方法,是递归的做。

In fact, we don’t need to know where the pivot is. Look at the middle element (7). Compare it with the left most (4) and right most element (2). The left most element (4) is less than (7). This gives us valuable information — All elements in the bottom half must be in strictly increasing order. Therefore, if the key we are looking for is between4 and 7, we eliminate the upper half; if not, we eliminate the bottom half.

 

第三种方法是,将第二种方法的递归改为迭代。思路完全相同。

 


 

如果数组中有重复元素,用上面的方法解决,唯一的问题就是当收尾元素相同的时候,比如[1,3,1,1,1]. 因为[1,3,1]不是一个有序的数组。

所以避免这种情况发生,只要让首元素不和最后一个相同就行。在[3,1,1,1]中间寻找target。

转载于:https://www.cnblogs.com/longhorn/p/3547372.html

你可能感兴趣的文章
提高班的“伞”
查看>>
python进阶七_文件操作(二)
查看>>
CentOS Docker 安装
查看>>
VMware-Ubuntu16.04LTS-安装ssh
查看>>
Linux命令之vi篇
查看>>
Linux之整理bash命令类型
查看>>
mysql学习1
查看>>
20162306陈是奇 第一次实验报告
查看>>
今日阅读项目源码
查看>>
数据库设计范式的理解
查看>>
Divisible Group Sums
查看>>
manacher模板整理
查看>>
.net:上传图片并将保存至指定目录下(支持PC端和移动端)
查看>>
iOS---初识Swift(一)
查看>>
蓝桥杯幸运数(线段树)
查看>>
uva 557 Burger
查看>>
python manage.py 命令
查看>>
HashMap源码解析
查看>>
PowerPCB(PADS)常见问题全集
查看>>
OC 冒泡排序 -- 核心代码
查看>>