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.


题目标签:Array
  题目中给了我们一个旋转有序序列,让我们找到target的index。 其实利用最基本的一个一个找过来都可以通过- -, 题目应该说的更明确一点。让我们利用binary search来搜索。
  以往我们利用binary search 来找的话,都是在排序好了的array里面。但是这一题,array不一定是排序好的。大部分情况都是一个array里,分2边,各自都是排序好的,但是中间有一个断点。我们来看原题中的例子:
 
  0  1  2  4  5  6  7  最原始的时候是有序排列的, 现在开始向左rotate
  1  2  4  5  6  7  0  从这时候开始,一边是有序的,另外一边也是有序的,中间有断点。
       2  4  5  6  7  0  1
  4  5  6  7  0  1  2
    6  7  0  1  2  4
    7  0  1  2  4  5
    0  1  2  4  5  6
  0  1  2  4  5  6  7  这里就回到了最初的情况
 
  来分析一下,一旦开始rotate, 就变成分开的两个有序序列,中间有个断点在移动。因为这个断点一直在移动,所以不好根据这个变量来判断。那么我们来找一个不变量来判断。
  我们看每次中间红色的点,当这个中间点比最左边蓝色的点大的时候,说明 左边的这半(包括中间点)一定是有序序列。右边的话,不确定。
  当这个中间的点没有比左边点大的时候,那么说明右边的有序序列已经移动过来了,并且占据了中间点,那么右边的一半(包括中间点)一定是有序序列。
 
  在了解这个规律后,就可以利用binary search来搜索了,binary search就是要判断,target 在哪一边,然后继续走到那一边里继续搜索。这里我们要通过那一半肯定是有序序列来帮助查找。首先判断中间点是不是target,不是的话就判断target是不是在有序序列里,通过有序序列里的两边来判断。是的话就继续跑到有序的那一边去继续搜索。如果不是在有序序列里,那么就跑到另外一边里面去继续搜索。
 
 

Java Solution:

Runtime beats 70.31%

完成日期:07/14/2017

关键词:Array

关键点:利用Binary Search 结合 rotated sorted array 中必然有一半是有序序列 来搜索

 public class Solution
{
public int search(int[] nums, int target)
{
if(nums == null || nums.length == 0)
return -1; int left = 0;
int right = nums.length - 1; while(left <= right)
{
int mid = left + (right - left) / 2; if(nums[mid] == target) // if the middle one is target, return mid index
return mid;
else if(nums[mid] >= nums[left]) // meaning left half is ascending order
{
if(target >= nums[left] && target < nums[mid]) // if target is in left half
right = mid - 1; // move to left half to search
else // target is in right half
left = mid + 1; // move to right half to search
}
else // meaning right half is ascending order
{
if(target > nums[mid] && target <= nums[right]) // if target is in right half
left = mid + 1;
else // target is in left half
right = mid - 1; } } return -1;
}
}

参考资料:

http://www.cnblogs.com/grandyang/p/4325648.html

LeetCode 算法题目列表 - LeetCode Algorithms Questions List

   
 

LeetCode 33. Search in Rotated Sorted Array(在旋转有序序列中搜索)的更多相关文章

  1. [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. ...

  2. [CareerCup] 11.3 Search in Rotated Sorted Array 在旋转有序矩阵中搜索

    11.3 Given a sorted array of n integers that has been rotated an unknown number of times, write code ...

  3. [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 migh ...

  4. LeetCode 33 Search in Rotated Sorted Array(循环有序数组中进行查找操作)

    题目链接 :https://leetcode.com/problems/search-in-rotated-sorted-array/?tab=Description   Problem :当前的数组 ...

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

  6. [array] leetcode - 33. Search in Rotated Sorted Array - Medium

    leetcode - 33. Search in Rotated Sorted Array - Medium descrition Suppose an array sorted in ascendi ...

  7. LeetCode 33 Search in Rotated Sorted Array [binary search] <c++>

    LeetCode 33 Search in Rotated Sorted Array [binary search] <c++> 给出排序好的一维无重复元素的数组,随机取一个位置断开,把前 ...

  8. [leetcode]81. Search in Rotated Sorted Array II旋转过有序数组里找目标值II(有重)

    This is a follow up problem to Search in Rotated Sorted Array, where nums may contain duplicates. 思路 ...

  9. [LeetCode] Find Minimum 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 ...

随机推荐

  1. 创建maven项目pom.xml第一行报错

    之前也创建过几次maven项目,也是第一行报错,之前直接是右键项目强制更新maven好像就解决了,这次遇见这个问题使用这个方法好像不起作用了,给的一堆英文报错又看不懂,幸好在网上看见路人甲大神提示,根 ...

  2. Mybatis第六篇【配置文件和映射文件再解读、占位符、主键生成与获取、Mapper代理】

    配置文件和映射文件再解读 映射文件 在mapper.xml文件中配置很多的sql语句,执行每个sql语句时,封装为MappedStatement对象,mapper.xml以statement为单位管理 ...

  3. SpringMVC第七篇【RESTful支持、拦截器】

    RESTful支持 我们在学习webservice的时候可能就听过RESTful这么一个名词,当时候与SOAP进行对比的-那么RESTful究竟是什么东东呢??? RESTful(Representa ...

  4. Oracle存储过程 一个具体实例

    表结构信息,并不是用oracle描述的,但是后面的存储过程是针对oracle的 ----------------个人交易流水表----------------------------------- c ...

  5. Spring-Hibernate-web的延迟加载方案

    1,现象与问题 /** * 由于Hibernate存在延迟加载问题,当Dao事务提交之后,session就关闭: * 此时如果到显示层就没有办法获取对象,使用openSessionInViewer是解 ...

  6. Saltstack批量编译部署nginx(多模块)

    最近一直在研究saltstack的同步文件和批量执行命令,随着架构的变大,批量部署的需求也变得明显起来了,我需要用一条命令就部署好nginx和tomcat,并且符合我所有的环境需求,可以直接投入生产环 ...

  7. CVE-2016-10191 FFmpeg RTMP Heap Buffer Overflow 漏洞分析及利用

    作者:栈长@蚂蚁金服巴斯光年安全实验室 一.前言 FFmpeg是一个著名的处理音视频的开源项目,使用者众多.2016年末paulcher发现FFmpeg三个堆溢出漏洞分别为CVE-2016-10190 ...

  8. NET应用——使用RSA构建相对安全的数据交互

    最近又被[现场破解共享单车系统]刷了一脸,不得不开始后怕:如何防止类似的情况发生? 想来想去,始终觉得将程序加密是最简单的做法.但是摩拜.ofo也有加密,为什么仍然被破解?那是因为请求在传输过程中被篡 ...

  9. Excel的实用函数

    在介绍Excel函数前先说明两个概念:公式和函数. 公式:由用户自行设计对工作表进行计算和处理的计算式,以等号"="开始,其内部可以包括函数.引用.运算符和常量. 函数:即是预先定 ...

  10. hdu1878判断欧拉回路

    欧拉回路 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...