【一天一道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 :当前的数组 ...
随机推荐
- 前端技术之_CSS详解第二天
前端技术之_CSS详解第二天 1.css基础选择器 html负责结构,css负责样式,js负责行为. css写在head标签里面,容器style标签. 先写选择器,然后写大括号,大括号里面是样式. & ...
- Java第7次实验提纲(多线程)
PTA与参考资料 题集:多线程 多线程实验参考文件 ThreadReading 实验-基础部分 1.1 基础题目MyThread类.自行完成题集合的:PrintTask 1.2 Runnable与匿名 ...
- Android源码解析——AsyncTask
简介 AsyncTask 在Android API 3引入,是为了使UI线程能被正确和容易地使用.它允许你在后台进行一些操作,并且把结果带到UI线程中,而不用自己去操纵Thread或Handler.它 ...
- postgresql 登录查看表定义
su - postgres psql \connect database_name; \d table_name
- OBJ文件格式分析工具: objdump, nm,ar
首先简要阐述关于gcc.glibc和 binutils模块之间的关系 一.关于gcc.glibc和binutils模块之间的关系 1.gcc(gnu collect compiler)是一组编译工具的 ...
- 20160222.CCPP体系详解(0032天)
程序片段(01):宽字符.c+字符串与内存四区.c 内容概要:宽窄字符 ///宽字符.c #include <stdio.h> #include <stdlib.h> #inc ...
- CSS3 滤镜学习
html篇 样式篇 grayscale sepia saturate hue-rotate invert opactiy brightness contrast blur drop-shadow 综合 ...
- Leetcode解题-链表(2.2.0)基础类
1 基类的作用 在开始练习LeetCode链表部分的习题之前,首先创建好一个Solution基类,其作用就是: Ø 规定好每个子Solution都要实现纯虚函数test做测试: Ø 提供了List ...
- 如何正确使用const、static、extern
转自:http://www.jianshu.com/p/2fd58ed2cf55 前言 本篇文章主要介绍在开发中怎么使用const.static.extern关键字. 一.const 与宏的区别: c ...
- UIScrollView实现图片轮播器的无限滚动
简介 在现在的一些App中常常见到图片轮播器,一般用于展示广告.新闻等数据,在iOS内并没有现成的控件直接实现这种功能,但是通过UIScrollView的允许分页设置,可以实现滚动轮播的功能. 轮播原 ...