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.


【题目分析】dan'sh

有一个没有重复元素的增序排序的数组,对这个数组进行玄旋转操作,然后在旋转后的数组中找到给定的target,如果找不到则返回-1。


【思路】

在一个有序的数组中查找一个数,最高效的就是二分查找。但是经过旋转操作以后数组分裂成了两段,在每一段中是有序的,这中情况下我们能对它使用二分查找嘛?

既然数组被分成了两段,如果我们使用二分查找能确定目标值在数组的哪段,然后改变查找的范围,那么就可以找到目标值。在二分查找的过程中要先确定中间位置的下标mid,通过中间值与最左边值的比较,我们可以确定中间值在数组中的哪一段,然后我们在比较目标值和中间值的大小,这样就能确定目标值的范围。举个例子如下:

  • 目标值为6,nums[mid] = 7 > nums[left]。因此中间值在左边一段,此时nums[left]<target<=nums[mid],可以确定目标值在左边一段。right = mid;

  • nums[mid] = 5 > nums[left]。因此中间值在左边一段,此时target>nums[mid]。left = mid + 1;

  • nums[mid] = 6 = nums[left]。因此中间值在左边一段,此时target=nums[mid]。right = mid;

  • left = right,找到目标值;

注意:

  • 当中间值在数组的左段时,要确定目标值的位置不能这样判断:if(target <= nums[mid]),因为我们发现此时数组右段也是满足这个条件的,因此必须这样判断:if(target <= nums[mid] && target >= nums[left]),这样才能保证目标值位与中间值的左边,对于其他的情况目标值肯定在中间值的右边。
  • 同理,当中间值在数组的右段时候,在确定目标值的位置时也要注意类似的情况。
  • 这个算法对于一个没有旋转的增序排序数组也是适用的。

【java代码】

 public class Solution {
public int search(int[] nums, int target) {
if (nums == null || nums.length == 0) return -1;
int l = 0, r = nums.length - 1;
while (l < r) {
int m = l + (r - l) / 2;
if (nums[m] >= nums[l]) {
if (target <= nums[m] && target >= nums[l]) r = m;
else l = m + 1;
}else {
if (target > nums[m] && target <= nums[r]) l = m + 1;
else r = m;
}
}
return nums[l] == target ? l : -1;
}
}

LeetCode OJ 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题解33.Search in Rotated Sorted Array

    33. Search in Rotated Sorted Array Suppose an array sorted in ascending order is rotated at some piv ...

  3. LeetCode OJ:Search in Rotated Sorted Array II(翻转排序数组的查找)

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

  4. 【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 ...

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

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

  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: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 解题报告(Python & C++)

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

  9. 【Leetcode】33. Search in Rotated Sorted Array

    Question: Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforeh ...

随机推荐

  1. jenkins 杀死衍生进程

    解决方法-1: 在execute shell输入框中加入BUILD_ID=DONTKILLME,即可防止jenkins衍生进程 解决方法-2: 修改/etc/sysconfig/jenkins配置,在 ...

  2. Let's Encrypt(开源SSL证书管理工具)

    刚装上一个StartSSL 的证书没几天,却看到官方发出这样的通知: 无聊中看到了网上各种相关的扯淡: http://tieba.baidu.com/p/4801786642 http://www.t ...

  3. centos6.5 安装ansible,管理多台服务器

    安装python(最低2.6v) (1).python2.7安装 wget https://www.python.org/ftp/python/2.7.8/Python-2.7.8.tgz # tar ...

  4. Java作用域

    1. java访问控制修饰符 Java中,可以使用访问控制符来保护对类.变量.方法和构造方法的访问.Java支持4种不同的访问权限. 默认的,也称为 default,在同一包内可见,不使用任何修饰符. ...

  5. My Sql多表操作(转载)

    DELETE 在Mysql4.0之后,mysql开始支持跨表delete. Mysql可以在一个sql语句中同时删除多表记录,也可以根据多个表之间的关系来删除某一个表中的记录. 假定我们有两张表:Pr ...

  6. 连续多个git提交发生了冲突时

    git checkout -b test 创建并切换到分支test git clone git branch master git merge test 合并test到master (git merg ...

  7. css中position中的几个属性

    static  是默认值.任意 position: static; 的元素不会被特殊的定位.一个 static 元素表示它不会被"positioned",一个 position 属 ...

  8. php 微信 自定义分享接口

    <?php class JSSDK { private $appId; private $appSecret; public function __construct($appId, $appS ...

  9. 为Textview里面的ImageSpan添加点击响应事件

    对于图文混排的TextView,用户在浏览到里面的图片的时候,往往有点击图片preview大图或者preview之后保存图片的需求,这就需要为Textview里面的ImageSpan设置点击响应事件. ...

  10. OC 调用JS 代码 处理HTML5 实战

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; ...