【LeetCode】搜索旋转排序数组【两次二分】
假设按照升序排序的数组在预先未知的某个点上进行了旋转。
( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。
搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。
你可以假设数组中不存在重复的元素。
你的算法时间复杂度必须是 O(log n) 级别。
示例 1:
输入: nums = [4,5,6,7,0,1,2], target = 0
输出: 4示例 2:
输入: nums = [4,5,6,7,0,1,2], target = 3
输出: -1来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/search-in-rotated-sorted-array
分析:时间复杂度要求是O(log N),原数组又是通过有序的数组变换得来的,所以我们可以联想到二分
先二分得到分割点k,分割点具有这样的特征:nums[k]>=nums[k+1]
找到了分割点k,我们可以得到两个区间:[0,k】,【k+1,n-1]
通过比较两个区间端点和target的大小关系,我们可以确定target位于两个区间中的哪一个
区间中的数肯定是有序的,这样我们可以在区间中继续通过二分来寻找target
总结:
两个二分,第一次寻找分割点,第二次寻找target
时间复杂度:O(log N)
空间复杂度:O(1)
class Solution {
public:
int search(vector<int>& v, int t)
{
int k=-1;
int n=v.size();
if(n==0)
return -1;
if(n==1)
{
if(v[0]==t)
return 0;
else
return -1;
}
int l,h;
l=0;
h=n-1;
if(v[l]<v[h])//不存在分割点
{
k=-1;
}
else
{
while(l<=h)//寻找分割点
{
int mid=(l+h)/2;
if(mid+1<=n-1&&v[mid]>v[mid+1])
{
k=mid;
break;
}
else
{
if(v[mid]<v[l])
h=mid-1;
else
l=mid+1;
}
}
}
//通过分割点确定target所属区间
if(k==-1)
{
if(t>v[n-1])
return -1;
if(t<v[0])
return -1;
l=0;
h=n-1;
}
if(t>v[n-1])
{
l=0;
h=k;
}
else if(t<v[0])
{
l=k+1;
h=n-1;
}
while(l<=h)//在区间中二分寻找target
{
int mid=(l+h)/2;
if(v[mid]>t)
{
h=mid-1;
}
else if(v[mid]<t)
{
l=mid+1;
}
else if(v[mid]==t)
{
return mid;
}
}
return -1;
}
};
【LeetCode】搜索旋转排序数组【两次二分】的更多相关文章
- LeetCode 搜索旋转排序数组
假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定的目标值,如果数组中存在这个目标值, ...
- 33,Leetcode 搜索旋转排序数组-C++ 递归二分法
题目描述 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定的目标值,如果数组中存在这 ...
- LeetCode 81 - 搜索旋转排序数组 II - [二分+暴力]
假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] ). 编写一个函数来判断给定的目标值是否存在于数组中. ...
- LeetCode:搜索旋转排序数组【33】
LeetCode:搜索旋转排序数组[33] 题目描述 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ...
- [LeetCode每日一题]81. 搜索旋转排序数组 II
[LeetCode每日一题]81. 搜索旋转排序数组 II 问题 已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同. 在传递给函数之前,nums 在预先未知的某个下标 k(0 & ...
- LeetCode(81): 搜索旋转排序数组 II
Medium! 题目描述: 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] ). 编写一个函数来判断给 ...
- LeetCode 81 搜索旋转排序数组II
题目: 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] ). 编写一个函数来判断给定的目标值是否存在于 ...
- LeetCode 81——搜索旋转排序数组 II
1. 题目 2. 解答 2.1. 方法一 基于 LeetCode 33--搜索旋转排序数组 中的方法二. 当 nums[mid] = nums[right] 时,比如 [1, 1, 2, 1, 1], ...
- LeetCode 81. 搜索旋转排序数组 II(Search in Rotated Sorted Array II)
题目描述 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] ). 编写一个函数来判断给定的目标值是否存在 ...
- Java实现 LeetCode 81 搜索旋转排序数组 II(二)
81. 搜索旋转排序数组 II 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] ). 编写一个函数来判 ...
随机推荐
- Linux安装node环境
一.进行连接远程: 1.命令窗口 —> 输入 ssh 用户名@主机IP —> 回车 2.输入密码 (输入后回车) 3.进入根目录 (命令:cd / ) 二.Linux环境安装node: T ...
- 解决 new file()在IOS下不兼容 的问题
最近 做项目,做的要是拍照后上传相片,以file格式上传..所以 拍照 后用canvas生成base64格式再转file..在PC和安卓都是没有问题,到IOS上面不行..new file后就是生成一个 ...
- Java 关于函数式接口与Lambda表达式之间的关系
java是一种面向对象的语言,java中的一切都是对象,即数组,每个类创建的实例也是对象.在java中定义的函数或方法不可能完全独立,也不能将方法函数作为参数或返回值给实例. 在java7及以前,我们 ...
- 微信小程序开发--flex详细解读(2)
一.align-items和其参数 stretch / baseline 注:sretch只有在交叉轴没有设置固定长度的情况下才有作用 ...
- Elasticasearch Web管理工具-Cerebro
cerebro是一个使用Scala,Play Framework,AngularJS和Bootstrap构建的开源(MIT许可)elasticsearch web管理工具.需要Java 1.8或更高版 ...
- flask 简单示例
flask import flask from flask import jsonify from flask import request # 要获取到请求参数的话,就要导入这个模块 ''' 创建接 ...
- 知识点6 C++数据类型转换 string
一.int转string 1.c++11标准增加了全局函数std::to_string: string to_string (int val); string to_string (long val) ...
- 异常EXCEPTION_HIJACK(0xe0434f4e)
简介 EXCEPTION_HIJACK,值为0xe0434f4e.意思是CLR线程劫持异常.异常劫持是CLR在挂起线程进行垃圾收集的过程中抛出的.它的抛出是为了帮助停止后恢复执行.它定义在..\clr ...
- ABP .net framework版 的发布
先正常的发布流程走 特别的如下图
- Struts CRUD
Struts CRUD 利用struts完成增删改查 思路: 1.导入相关的pom依赖(struts.自定义标签库的依赖) 2.分页的tag类导入.z.tld.完成web.xml的配置 3.dao层去 ...