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. HTTP请求的header头解析

    Request Headers: 下图是我访问一个URL:http://www.hzau.edu.cn的一个header,根据具体实例来分析一下各部分的功能及其作用. Accept 作用: 浏览器端可 ...

  2. tomcat管理界面登录无法进入

    问题: 在打开tomcat界面之后,点击Manger App准备进入管理界面,路径:http://localhost:8080/manager/html. 输入正确的用户名和密码,但是出现401界面. ...

  3. FS BPM 业余研发(用户详细操作手册--单人串行/并行)之 深圳分公司技术部请假审批流程

    1.FS BPM 简介 BPM软件中BPM是英文字母缩写,大致有二个意思.第一.Business Process Management,即业务流程管理,是一套达成企业各种业 务环节整合的全面管理模式. ...

  4. Apache CXF入门

    CXF简介 Apache CXF = Celtix + XFire,开始叫 Apache CeltiXfire,后来更名为 Apache CXF 了.CXF 继承了 Celtix 和 XFire 两大 ...

  5. Local Binary Convolutional Neural Networks ---卷积深度网络移植到嵌入式设备上?

    前言:今天他给大家带来一篇发表在CVPR 2017上的文章. 原文:LBCNN 原文代码:https://github.com/juefeix/lbcnn.torch 本文主要内容:把局部二值与卷积神 ...

  6. 方法--printStackTrace()

    java抛出异常的方法有很多,其中最常用的两个: System.out.println(e),这个方法打印出异常,并且输出在哪里出现的异常,不过它和另外一个e.printStackTrace()方法不 ...

  7. [js高手之路] html5 canvas系列教程 - arcTo(弧度与二次,三次贝塞尔曲线以及在线工具)

    之前,我写了一个arc函数的用法:[js高手之路] html5 canvas系列教程 - arc绘制曲线图形(曲线,弧线,圆形). arcTo: cxt.arcTo( cx, cy, x2, y2, ...

  8. javascript篇-----数据类型

    ECMAScript中一共有6种数据类型,其中包括5种基本数据类型(Undefined,Null,Boolean,Number,String)以及一种复杂数据类型(Object).[ES6增加多了一种 ...

  9. 【转】深入理解CSS定位中的偏移

    前面的话 CSS有三种基本的定位机制:普通流.浮动和绝对定位.利用定位,可以准确地定义元素框相对于其正常位置应该出现的位置,或者相对于父元素.另一个元素甚至浏览器窗口本身的位置.但元素究竟如何定位,定 ...

  10. submit text3的激活与使用

    SublimeText3常用快捷键和优秀插件 SublimeText是前端的一个神器,以其精简和可DIY而让广大fans疯狂.好吧不吹了直入正题 -_-!! 首先是安装,如果你有什么软件管家的话搜一下 ...