leetcode解题报告(3):Search in Rotated Sorted Array
描述
Suppose a sorted array is rotated at some pivot unknown to you beforehand.
(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).
You are given a target value to search. If found in the array return its index, otherwise return -1.
You may assume no duplicate exists in the array.
分析
这道题目不难,主要是性能问题。常规解法如下:
class Solution{
public:
int search(int A[],int n,int target){
for(int i = 0; i != n; ++i){
if(A[i] == target) //if found
return i; //return its index
}
return -1; //otherwise return -1
}
}
该算法时间复杂度为O(n),空间复杂度为O(1)。
事实上用二分查找算法会获得更好的性能。
由于本题的有序数组是经过“旋转”的,因此只是部分有序。
以题目所给数组为例,[4 5 6 7 0 1 2]在经过旋转后,整个数组变得无序,但是0两侧的部分数组是有序的。根据二分算法的思想,进行查找的步骤如下:
若A[first] < A[mid],则说明[first,mid)这个区间是有序的,再在这个区间内进行二分查找:
若A[first] <= target 并且target < A[mid] ,则target必在此有序区间中,修改last的值为mid;
否则,说明target在另一半区间(可能是无序的),修改first的值为mid+1;
若A[first] >= A[mid],则说明该区间无序(那么另一区间是有序的),同样在这个区间进行二分查找:
若A[mid] < target 并且 target <= A[last - 1],则说明target在另一半有序区间中,修改first的值为mid+1(注意这一步,比较的是另一半有序区间);
否则,说明target在本区间(是无序的),修改last的值为mid;
重复以上过程,直到找到target或遍历结束(first == last);若遍历结束仍未找到,返回-1,否则,返回mid。
该算法的重点在于,必须要对两个区间分别进行查找,并且只在有序区间对target进行二分查找(旋转过后必然会有一区间有序,一区间无序,而不可能同时无序),target要么在有序的一部分,要么在无序的一部分,要么不存在。且若能找到target,必然会是mid的下标
class Solution{
public:
int search(int A[],int n,int target){
int search(int A[],int n,int target){
int first = 0,last = n;
int mid = (first + last) / 2;
while(first != last){
if(A[mid] == target) //if found,the target value's index must be mid
return mid;
if(A[first] < A[mid]){ //if ordered
if(A[first] <= target && target < A[mid]) //if target is in [first,mid)
last = mid;
else //if not
first = mid + 1;
}else{ //if unordered
if(A[mid] <= target && target < A[last - 1]) //if in [mid,last-1)
first = mid + 1;
else //otherwise
last = mid;
}
}
return -1; //if not found,return -1
}
}
}
该算法时间复杂度为
O(log_2n)
空间复杂度为O(1)。
(题目没有说明该数组是递增有序还是递减有序,真奇怪。这里默认递增。)
leetcode解题报告(3):Search in Rotated Sorted Array的更多相关文章
- leetcode第32题--Search in Rotated Sorted Array
Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 migh ...
- LeetCode 笔记系列九 Search in Rotated Sorted Array
题目: Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 ...
- LeetCode(33)Search in Rotated Sorted Array
题目 Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 m ...
- leetcode个人题解——#33 Search in Rotated Sorted Array
思路:每次取中间元素,一定有一半有序,另一半部分有序,有序的部分进行二分查找,部分有序的部分递归继续处理. class Solution { public: ; int middleSearch(in ...
- LeetCode: Search in Rotated Sorted Array II 解题报告
Search in Rotated Sorted Array II Follow up for "LeetCode: Search in Rotated Sorted Array 解题报告& ...
- LeetCode: Search in Rotated Sorted Array 解题报告
Search in Rotated Sorted Array Suppose a sorted array is rotated at some pivot unknown to you before ...
- LeetCode解题报告—— Search in Rotated Sorted Array & Search for a Range & Valid Sudoku
1. Search in Rotated Sorted Array Suppose an array sorted in ascending order is rotated(轮流,循环) at so ...
- 【LeetCode】81. Search in Rotated Sorted Array II 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址:https://leetcode.com/problems/search-in ...
- LeetCode 新题: Find Minimum in Rotated Sorted Array 解题报告-二分法模板解法
Find Minimum in Rotated Sorted Array Question Solution Suppose a sorted array is rotated at some piv ...
- 【LeetCode】153. Find Minimum in Rotated Sorted Array 解题报告(Python)
[LeetCode]153. Find Minimum in Rotated Sorted Array 解题报告(Python) 标签: LeetCode 题目地址:https://leetcode. ...
随机推荐
- ASP.NET Core分布式项目-3.oauth2与open id connect 对比
oauth2 open id connect
- CentOS7.x使用overlay2文件系统
当我查看docker详细信息时会看到如下警告: WARNING: devicemapper: usage of loopback devices is strongly discouraged for ...
- 红帽linux系统开机自启动脚本。
其实很多东西在最后完成以后会觉得也就那样,有意思的是探究的过程. 前段时间老板要求把一个程序做成linux系统开机自启动脚本的模式. 首先你需要写一个脚本. 我这边建立了一个.sh的脚本,就是用脚本启 ...
- hdu 6143
题意:有m种字符,要求构造两段长度为n的字符串,其中这两段不能有相同的字符 枚举左边选了i种字符,右边可以选1,2....min(n,m-i)种字符 这样就把问题转化为用k种字符构造n长度的字符串的种 ...
- win8怎么强制删除文件
转自:https://www.jizhuba.com/zhichanglicai/20180119/5705.html 方法/步骤1.例如我们想删除桌面上的“123”文件夹,发现无法删除.2.可以这样 ...
- cocos发布遇到的问题
学习第二天,用官方的demo进行打包,出现以下问题: 第一个问题: 报错信息:scene 没有保存,请先保存相关信息再进行构建. 解决方案:ctrl+s保存即可,一开始没注意前面的英文是场景的意思 第 ...
- Java基础加强-代理
/*代理*//*代理的概念与作用*/ 代理过程架构 客户端Client原来直接调用的是Target目标类 使用代理后,现在让客户端不要调用Target,调用代理类Proxy,代理类Proxy和目标类T ...
- eclipse导入项目后出现红色叉号的解决方案
对于一名程序员来说,我导入的项目在项目的名称上无端加了一个红色的叉号,虽然这个不友好的符号,对于我整个的项目运行没有任何影响,但是总让我觉得不舒服,大大的叉号写在我的项目的脑袋上,我心里能舒服吗?于是 ...
- C#面向对象 什么是面向对象
1.面向对象(Object Oriented,OO) 是当前计算机界关心的重点,它是90年代软件开发方法的主流.面向对象的概念和应用已超越了程序设计和软件开发,扩展到很宽的范围.如数据库系统.交互式界 ...
- Mysql中的锁机制-转载
原文:http://blog.csdn.net/soonfly/article/details/70238902 锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的 计算资源(如 ...