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. http缓存协议详解

    Cache-control策略(重点关注):Cache-Control与Expires的作用一致,都是指明当前资源的有效期,控制浏览器是否直接从浏览器缓存取数据还是重新发请求到服务器取数据 no-ca ...

  2. IOS 成员变量,全局变量,局部变量定义,static与extern的区别

    IOS 成员变量,全局变量,局部变量定义,static与extern的区别 1,先说定义 1)成员变量定义:生存与该类的生命周期,变量存活周期跟你定义的该类实体对象一样:作用域是整个实体对象:可以在h ...

  3. cdh 安装记录

    安装文件准备 CDH 下载地址:http://archive.cloudera.com/cdh5/parcels/latest/ 下载操作系统对应的版本: 1.CDH-5.3.0-1.cdh5.3.0 ...

  4. Android 不能返回 parent Activity 的问题

    使用 ActionBar,开启返回按钮: 在 Activity 的 onCreate 中添加下面代码 getSupportActionBar().setDisplayHomeAsUpEnabled(t ...

  5. CodeForces 670D Magic Powder

    二分. 二分一下答案,然后验证一下. #pragma comment(linker, "/STACK:1024000000,1024000000") #include<cst ...

  6. Signal and Slots

    Signal and Slots 用于对象之间通信. 它是 Qt 的核心特性之一, 并且也是Qt 与其它框架差别最大的部分. 概述 在GUI编程中, 如果我们改变了一个控件, 我们可能想其它控件知道: ...

  7. document对象相关的几个常用的方法

    方法  描述 var newP=createElement("p"); 创建了一个p标签,p也可替换为div,span等 var oldTxt=createTextNode(&qu ...

  8. Java多线程的信号量

    Java的信号量主要的作用是控制线程对资源的访问例如我一个线程池里面有100个线程等待执行,但是我允许最多同时运行5个线程,这5个线程只有其中一个线程执行完毕后,在线程池中等待的线程才能进入开始执行, ...

  9. hdu 2188 选拔志愿者(sg博弈)

    Problem Description 对于四川同胞遭受的灾难,全国人民纷纷伸出援助之手,几乎每个省市都派出了大量的救援人员,这其中包括抢险救灾的武警部队,治疗和防疫的医护人员,以及进行心理疏导的心理 ...

  10. 【转】JQuery.Ajax之错误调试帮助信息

    下面是Jquery中AJAX参数详细列表: 参数名 类型 描述 url String (默认: 当前页地址) 发送请求的地址. type String (默认: "GET") 请求 ...