方法一:先找到旋转点,然后根据目标值重新确定二分查找区域。

时间复杂度:用到两次二分查找,每次二分查找粗略的认为是O(logn),那么时间复杂度为2 * O(logn);

空间复杂度:O(1)。

 int search(vector<int>& nums, int target) {
if (!nums.size()) return -; int low = , high = nums.size() - , mid;
int rotate = ; //旋转点
//第一步先找到旋转点
if (nums[low] <= nums[high]) rotate = ; //无旋转
else
{
while (low < high)
{
mid = low + ((high - low) >> );
if (nums[mid] > nums[mid + ]) break; if (nums[mid] >= nums[low]) low = mid;
else high = mid;
}
rotate = mid + ;
}
//重新规划二分查找区域
if (!rotate)
{
low = ;
high = nums.size() - ;
}
else
{
if (nums[] == target) return ;
else if (nums[] > target)
{
low = rotate;
high = nums.size() - ;
}
else
{
low = ;
high = rotate - ;
}
}
//二分查找
while (low <= high)
{
mid = low + ((high - low) >> );
if (nums[mid] == target) return mid;
else if (nums[mid] > target) high = mid - ;
else low = mid + ;
} return -;
}

方法二:根据中间点和其他条件来调整上下边界。其实一开始就想的这个办法,但是写的过程中发现很混乱,所以就写了上一种比较清晰的方法。这个方法的关键是确定哪半边是有序的,在这个前提下分情况讨论会很清晰。

时间复杂度:O(logn),空间复杂度:O(1)。

 int search(vector<int>& nums, int target) {
if (!nums.size()) return -; //数组为空 int low = , high = nums.size() - , mid;
if (nums[low] <= nums[high]) //数组无旋转点,即升序排列
{
while (low <= high)
{
mid = low + ((high - low) >> );
if (nums[mid] == target) return mid;
else if (nums[mid] > target) high = mid - ;
else low = mid + ;
}
return -;
}
else //数组有旋转点
{
while (low <= high)
{
mid = low + ((high - low) >> );
if (nums[mid] == target) return mid; if (nums[mid] > nums[low]) //左半边有序
{
if (nums[low] < target && nums[mid] > target) high = mid - ;
else if (nums[low] == target) return low;
else low = mid + ;
}
else //右半边有序
{
if (nums[high] > target && nums[mid] < target) low = mid + ;
else if (nums[high] == target) return high;
else high = mid - ;
}
}
return -;
}
}

总结:1)分析时把握问题的特征,不要没有头绪的想,不然就是猜了;

2)O(logn)复杂度是非常优秀的时间复杂度。

LeetCode33—搜索旋转排序数组的更多相关文章

  1. LeetCode33 搜索旋转排序数组

    搜索旋转排序数组 题目描述: 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定的目标 ...

  2. 二分查找(通过相对位置判断区间位置)--17--二分--LeetCode33搜索旋转排序数组

    搜索旋转排序数组 假设按照升序排序的数组在预先未知的某个点上进行了旋转.( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定的目标值,如果数组中 ...

  3. [Swift]LeetCode33. 搜索旋转排序数组 | Search in Rotated Sorted Array

    Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e. ...

  4. 【1】【leetcode-33,81】 搜索旋转排序数组

    (没思路) 33. 搜索旋转排序数组 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给 ...

  5. LeetCode33题——搜索旋转排序数组

    1.题目描述 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定的目标值,如果数组中存 ...

  6. lintcode 中等题:搜索旋转排序数组II

    题目 搜索旋转排序数组 II 跟进“搜索旋转排序数组”,假如有重复元素又将如何? 是否会影响运行时间复杂度? 如何影响? 为何会影响? 写出一个函数判断给定的目标值是否出现在数组中. 样例 给出[3, ...

  7. lintcode :搜索旋转排序数组

    题目 搜索旋转排序数组 假设有一个排序的按未知的旋转轴旋转的数组(比如,0 1 2 4 5 6 7 可能成为4 5 6 7 0 1 2).给定一个目标值进行搜索,如果在数组中找到目标值返回数组中的索引 ...

  8. [Swift]LeetCode81. 搜索旋转排序数组 II | Search in Rotated Sorted Array II

    Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e. ...

  9. LeetCode 81 - 搜索旋转排序数组 II - [二分+暴力]

    假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] ). 编写一个函数来判断给定的目标值是否存在于数组中. ...

随机推荐

  1. centos安装rabbitmq

    RabbitMQ是流行的开源消息队列系统,是AMQP(Advanced Message Queuing Protocol高级消息队列协议)的标准实现,用erlang语言开发.RabbitMQ据说具有良 ...

  2. VC6.0打开或添加工程时崩溃的解决方法

    官方解决办法(英文):http://support.microsoft.com/kb/241396/en-us 网友解决(中文):http://blog.163.com/wjatnx@yeah/blo ...

  3. Eureka服务下线后快速感知配置

    现在由于eureka服务越来越多,发现服务提供者在停掉很久之后,服务调用者很长时间并没有感知到变化,依旧还在持续调用下线的服务,导致长时间后才能返回错误,因此需要调整eureka服务和客户端的配置,以 ...

  4. SpringBoot技术栈搭建个人博客【前台开发/项目总结】

    前言:写前台真的是我不擅长的东西...所以学习和写了很久很久...前台页面大概开发了两天半就开发好了,采用的静态的html和bootstrap来写,写后台的时候纠结住了...怎么说呢,写页面真的是头疼 ...

  5. .Net Core的Log方式:Serilog+Kibana

    前言 Serilog,支持对象,把log数据序列化成Json,好用方便,容易拓展.Github: https://github.com/handsomeyao77/serilog-sinks-elas ...

  6. 1.4部署到IIS「深入浅出ASP.NET Core系列」

    希望给你3-5分钟的碎片化学习,可能是坐地铁.等公交,积少成多,水滴石穿,谢谢关注. 很多人第一次在IIS中部署Asp.Net Core App的人都会遇到问题,会发现原来的部署方式无法运行Asp.N ...

  7. 内核中 EXPORT_SYMBOL 标志分析

    内核版本:Linux-4.19 1. EXPORT_SYMBOL 的作用: EXPORT_SYMBOL 定义的函数或者符号对全部内核代码公开,不用修改内核代码就可以在其它内核模块中直接调用,即使用 E ...

  8. C# 在PPT中绘制形状(shape)

    概述 本篇文章将介绍C# 在PPT幻灯片中操作形状(shape)的方法.这里主要涉及常规形状,如箭头.矩形.圆形.三角形.多边形.不规则形状等.下面的示例中,可以通过绘制形状,并设置相应格式等.示例包 ...

  9. 折腾Java设计模式之单例模式

    博文原址:折腾Java设计模式之单例模式 单例模式 Ensure a class has only one instance, and provide a global point of access ...

  10. 04 入门 - ASP.NET MVC应用程序的结构

    目录索引:<ASP.NET MVC 5 高级编程>学习笔记 用Visual Studio创建了一个新的ASP.NET MVC应用程序后,将自动向这个项目中添加一些文件和目录. 如图所示: ...