【一天一道LeetCode】#33. Search in Rotated Sorted Array
一天一道LeetCode
本系列文章已全部上传至我的github,地址:
https://github.com/Zeecoders/LeetCode
欢迎转载,转载请注明出处
(一)题目
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.
(二)解题
一个排好序的数组,经过一定的旋转之后得到新的数组,在这个新的数组中查找一个目标数。
那么,首先我们需要在旋转后的数组中找到原数组的起始点,并将数组分成两部分。
例如:4,5,6,7,0,1,2分为4,5,6,7和0,1,2
然后,确定目标数在哪一个部分,
最后,采用二分法来进行加速搜索!
具体看代码:
未优化版本
class Solution {
public:
int search(vector<int>& nums, int target) {
int len = nums.size();
int i = 0 ;
int j = len-1;
int p = 0 ;
while(p+1<len&&nums[p]<nums[p+1]) p++;//找出第一个破坏升序的数即为旋转中心
if(nums[0]<=target) j=p;//确定被查找的数在哪个部分
else if(nums[len-1]>=target) i=p+1;
while(i<=j)//二分搜索
{
int mid = (i+j)/2;
if(nums[mid] == target) return mid;
else if(nums[mid] >target) j= mid-1;
else i = mid+1;
}
return -1;//未找到则返回-1
}
};
AC之后一看运行时间8ms,看来代码还有待优化,于是在查找旋转中心的方法上进行优化,采用二分法进行搜索旋转中心。
优化版本
class Solution {
public:
int search(vector<int>& nums, int target) {
int len = nums.size();
int i = 0;
int j = len - 1;
int p = 0;
bool isfind = false;
if (nums[0]>nums[len-1])//如果进行了旋转
{
while (i < j)//二分搜索旋转中心
{
if (i == j - 1) {
isfind = true;
break;
}
int mid = (i + j) / 2;
if (nums[i] < nums[mid]) i = mid;
if (nums[j] > nums[mid]) j = mid;
}
}
if (isfind)//找到了旋转中心
{
if (nums[0] <= target) { j = i; i = 0; }
if (nums[len - 1] >= target) { i = j; j = len - 1;}
}
while (i<=j)二分搜索目标数
{
int mid = (i + j) / 2;
if (nums[mid] == target) return mid;
else if (nums[mid] >target) j = mid-1;
else i = mid+1;
}
return -1;
}
};
优化后的版本运行时间4ms,快了一半!
【一天一道LeetCode】#33. Search in Rotated Sorted Array的更多相关文章
- [array] leetcode - 33. Search in Rotated Sorted Array - Medium
leetcode - 33. Search in Rotated Sorted Array - Medium descrition Suppose an array sorted in ascendi ...
- LeetCode 33 Search in Rotated Sorted Array [binary search] <c++>
LeetCode 33 Search in Rotated Sorted Array [binary search] <c++> 给出排序好的一维无重复元素的数组,随机取一个位置断开,把前 ...
- [LeetCode] 33. Search in Rotated Sorted Array 在旋转有序数组中搜索
Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e. ...
- LeetCode 33. Search in Rotated Sorted Array(在旋转有序序列中搜索)
Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e. ...
- leetCode 33.Search in Rotated Sorted Array(排序旋转数组的查找) 解题思路和方法
Search in Rotated Sorted Array Suppose a sorted array is rotated at some pivot unknown to you before ...
- LeetCode 33.Search in Rotated Sorted Array(M)
题目: Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. ( ...
- 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 migh ...
- Java [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 ...
- [leetcode]33. Search in Rotated Sorted Array旋转过有序数组里找目标值
Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e. ...
- LeetCode 33 Search in Rotated Sorted Array(循环有序数组中进行查找操作)
题目链接 :https://leetcode.com/problems/search-in-rotated-sorted-array/?tab=Description Problem :当前的数组 ...
随机推荐
- Docker配置 DNS
Docker 没有为每个容器专门定制镜像,那么怎么自定义配置容器的主机名和 DNS 配置呢? 秘诀就是它利用虚拟文件来挂载到来容器的 3 个相关配置文件. 在容器中使用 mount 命令可以看到挂载信 ...
- Android开发艺术探索第五章——理解RemoteViews
Android开发艺术探索第五章--理解RemoteViews 这门课的重心在于RemoteViews,RemoteViews可以理解为一种远程的View,其实他和远程的Service是一样的,Rem ...
- Linux 性能监测:CPU
CPU 的占用主要取决于什么样的资源正在 CPU 上面运行,比如拷贝一个文件通常占用较少 CPU,因为大部分工作是由 DMA(Direct Memory Access)完成,只是在完成拷贝以后给一个中 ...
- Android ocr识别文字介绍(文字识别)
最近在做身份证号码识别,在网上搜索的一番后发现目前开源的OCR中tesseract-ocr算是比较强大的了,它由HP于1985年到1995年间开发,后来由google直接负责,经过谷歌进一步开发后,目 ...
- Docker学习笔记2: Docker 概述
一.什么是Docker Docker是基于Go语言实现的云开源项目. Docker 的主要目标是:"Bulid,Ship and Run Any App ,AnyWhere" , ...
- 可能是CAP理论的最好解释
一篇非常精彩的解释CAP理论的文章,翻译水平有限,不准确之处请参考原文,还请见谅. Chapter 1: "Remembrance Inc" Your new venture : ...
- Xcode7.3.1中SKAudioNode在Scene转换后无声的问题
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 在新的Xcode中之前可以正常运行的SKAudioNode代码 ...
- [线程]Thead 中传参数RuntimeError: thread.__init__() not called
在写一个多线程类的时候调用报错 RuntimeError: thread.__init__() not called class NotifyTread(threading.Thread): def ...
- Mysql创建、删除用户、用户管理等相关:转载http://www.cnblogs.com/fly1988happy/archive/2011/12/15/2288554.html
MySql中添加用户,新建数据库,用户授权,删除用户,修改密码(注意每行后边都跟个;表示一个命令语句结束): 1.新建用户 登录MYSQL: @>mysql -u root -p @>密码 ...
- android 集成微博常见问题
我们在做微博集成登录.分享.聊天的时候,肯定会遇到很多的坑,这里总结下常见的问题. 文件不存在 C8998 的解决方法 如图我们走微博授权登录的时候如果OAuth2.0 授权设置回调页面设置和本地的不 ...