33. Search in Rotated Sorted Array

Suppose an array sorted in ascending order 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.

Subscribe to see which companies asked this question.

My Thought

题目的大致意思是,给定一个升序数组,但是这个数组在某个位置进行了旋转,比如上述题目中的例子。然后给定一个数字,让你找出该数字在数组中的位置。

一般的二分搜索肯定是不行了。

对于一个未旋转的升序数组:

\[[x_1,x_2,x_3,...,x_n]$$有
$$x_1\leq x_2\leq x_3...\leq x_n\]

假定旋转元素是\(x_j\),则旋转后

\[[x_{j+1},x_{j+2}...x_n,x_1,x_2,...x_j]
\]

其中左半部分恒有\(\geq x_j\),同理,右半部分\(\leq x_j\),对于二分查找,每次 mid 的落点不是在右半部分,就是在左半部分。

问题具有对称性,我们假设落点在左半部分,即

\[j+1\leq mid \leq n
\]

那么当目标元素 target 落在 \([j+1,mid]\) 之间时,就是一个普通的二分查找问题,return binary_search(j+1,mid) 即可,如果 target 落在\([mid,n]\)之间,那么问题变成了原问题的子问题,此时查找区间变成了

\[[x_{mid+1},x_{mid+2},...x_n,x_1,x_2...x_j]
\]

最后注意一下查找不到的情况,和递归结束条件即可。

Code(C++ 9ms)

class Solution {
public:
int bs(vector<int>&nums, int l,int h, int t){
if(l<=h){
int mid = (l+h)/2;
if(nums[mid]<t)
return bs(nums,mid+1,h,t);
else if(nums[mid]>t)
return bs(nums,l,mid-1,t);
return mid;
}
return -1;
}
int rsearch(vector<int>&nums, int l,int h, int target){
if(l<=h){
int mid = (l+h) / 2;
if(nums[mid]==target)
return mid;
// big part
if(nums[mid]>=nums[l]){
if(target>=nums[l]&&target<=nums[mid])
return bs(nums,l,mid,target);
else
return rsearch(nums,mid+1,h,target);
}
// small part
else if(nums[mid]<nums[l]){
if(target<=nums[h]&&target>=nums[mid])
return bs(nums,mid,h,target);
else
return rsearch(nums,l,mid-1,target);
}
}
return -1; }
int search(vector<int>& nums, int target) {
if(nums.size()<1)
return -1;
return rsearch(nums, 0, nums.size()-1,target); }
};

另外最近闲着没事就会去leetcode刷题(keep coding 233),题解都放在了我的上github-LeetCodeSolution上,有兴趣的可以star一下啊(各位父老乡亲帮帮忙TT。P.S.题解都是用markdown写的,而且有时候还会用尴尬的英语。。另外github好像不支持LaTeX公式,需要的可以用自己的markdown编辑器打开。

LeetCode题解33.Search in Rotated Sorted Array的更多相关文章

  1. [Leetcode][Python]33: Search in Rotated Sorted Array

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 33: Search in Rotated Sorted Arrayhttps ...

  2. leetcode 题解:Search in Rotated Sorted Array II (旋转已排序数组查找2)

    题目: Follow up for "Search in Rotated Sorted Array":What if duplicates are allowed? Would t ...

  3. 【LeetCode】33. Search in Rotated Sorted Array (4 solutions)

    Search in Rotated Sorted Array Suppose a sorted array is rotated at some pivot unknown to you before ...

  4. 【一天一道LeetCode】#33. Search in Rotated Sorted Array

    一天一道LeetCode 本系列文章已全部上传至我的github,地址: https://github.com/Zeecoders/LeetCode 欢迎转载,转载请注明出处 (一)题目 Suppos ...

  5. 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  ...

  6. leetcode problem 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 ...

  7. LeetCode OJ 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 ...

  8. leetcode个人题解——#33 Search in Rotated Sorted Array

    思路:每次取中间元素,一定有一半有序,另一半部分有序,有序的部分进行二分查找,部分有序的部分递归继续处理. class Solution { public: ; int middleSearch(in ...

  9. 【LeetCode】33. Search in Rotated Sorted Array 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

随机推荐

  1. CentOS7下安装Redis

    一.下载redis wget http://download.redis.io/releases/redis-4.0.6.tar.gz 二.解压 tar -zxvf redis-4.0.6.tar.g ...

  2. vue动态绑定background:url绑不上的问题

    场景: 利用swipper做轮播图,在联调的时候发现有些图片存在有些图片不存在 原因:图片路径中存在 (),和 background:url() 会冲突 解决方法: 一:oss图片路径避免出现括号 ( ...

  3. centos7 使用kubeadm 快速部署 kubernetes 国内源

    前言 搭建kubernetes时看文档以及资料走了很多弯路,so 整理了最后成功安装的过程已做记录.网上的搭建文章总是少一些步骤,想本人这样的小白总是部署不成功(^_^). 准备两台或两台以上的虚拟机 ...

  4. maven学习--1.项目结构及简单使用

    1.项目目录结构 MavenProjectRoot(项目根目录)   |----src   |     |----main   |     |         |----java ——存放项目的.ja ...

  5. 如何让 curl 命令通过代理访问

    如何让 curl 命令通过代理访问 Linux.中国 - 开源中文社区 2018-01-18 8909 阅读 技术 我的系统管理员给我提供了如下代理信息: IP: 202.54.1.1 Port: 3 ...

  6. Eclispe 错误:找不到或无法加载加载主类

    解决办法: Project --> Clean Clean 操作会将该 project 以前的所有编译信息清空,然后默认将所有工程的所有 .java 文件都进行一次编译,这样的话就可以方便的进行 ...

  7. [gazebo-1] process has died [pid 22855, exit code 255,

    [gazebo-1] process has died [pid 22855, exit code 255, cmd /opt/ros/kinetic/lib/gazebo_ros/gzserver ...

  8. Quartz一次配置

    1. 配置执行器的线程池 public ThreadPoolTaskExecutor defaultThreadPool() { ThreadPoolTaskExecutor executor = n ...

  9. 分离式lnmp部署

    分离式lnmp简介 lnmp和lamp一样,是一种常用的web环境, 在实际环境中,lnmp中的三个服务常常为了更好的性能而分在三台主机上安装. 本篇内只介绍nginx和php-fpm+mysql分离 ...

  10. WebApi 增加身份验证 (OAuth 2.0方式)

    1,在Webapi项目下添加如下引用: Microsoft.AspNet.WebApi.Owin Owin Microsoft.Owin.Host.SystemWeb Microsoft.Owin.S ...