Level:

  Medium

题目描述:

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.

Your algorithm's runtime complexity must be in the order of O(log n).

Example 1:

Input: nums = [4,5,6,7,0,1,2], target = 0
Output: 4

Example 2:

Input: nums = [4,5,6,7,0,1,2], target = 3
Output: -1

思路分析:

  有序旋转数组,设置两个指针,left和right,分别指向数组的左端和右端,求数组的mid,如果mid的值大于left的值,那么旋转点在mid后面,如果小于left,则证明旋转点在mid前面。

  如果旋点在mid的后面,并且target的值大于left处的值,小于mid处的值,那么接下来就可以在left到mid之间进行二分查找target,否则对mid+1到right这部分数组进行递归操作。

  如果旋点在mid的前面,并且target的值大于mid处的值,小于right处的值,那么接下来就可以在mid到right之间进行二分查找target,否则对left到mid-1这部分数组进行递归操作。

代码:

public class Solution{
public int search(int []nums,int target){
if(nums==null||nums.length==0)
return -1;
int res=find(nums,0,nums.length-1,target);
return res;
}
public int find(int []nums,int left,int right,int target){
if(nums[left]==target)
return left;
if(nums[right]==target)
return right;
int mid=(left+right)/2;
if(nums[mid]==target)
return mid;
if(left>right)
return -1;
if(nums[mid]>nums[left]){ //证明旋转点在mid后面
if(target>nums[left]&&target<nums[mid]){
return binarySearch(nums,left,mid-1,target);
}else{
return find(nums,mid+1,right,target);
} }
if(nums[mid]<nums[left]){ //证明旋转点在mid的前面
if(target>nums[mid]&&target<nums[right]){
return binarySearch(nums,mid+1,right,target);
}else{
return find(nums,left,mid-1,target);
}
}
return -1;
}
public int binarySearch(int []nums,int left,int right,int target){
if(left<=right){
int mid=(left+right)/2;
if(nums[mid]==target)
return mid;
if(target>nums[mid]){
return binarySearch(nums,mid+1,right,target);
}
if(target<nums[mid]){
return binarySearch(nums,left,mid-1,target);
}
}
return -1;
}
}

28.earch in Rotated Sorted Array(排序旋转数组中查找)的更多相关文章

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

  2. 【LeetCode】Find Minimum in Rotated Sorted Array 在旋转数组中找最小数

    Add Date 2014-10-15 Find Minimum in Rotated Sorted Array Suppose a sorted array is rotated at some p ...

  3. Leetcode33--->Search in Rotated Sorted Array(在旋转数组中找出给定的target值的位置)

    题目: 给定一个旋转数组,但是你不知道旋转位置,在旋转数组中找出给定target值出现的位置:你可以假设在数组中没有重复值出现 举例: (i.e., 0 1 2 4 5 6 7 might becom ...

  4. [LeetCode] 34. Find First and Last Position of Element in Sorted Array 在有序数组中查找元素的第一个和最后一个位置

    Given an array of integers nums sorted in ascending order, find the starting and ending position of ...

  5. LeetCode(力扣)——Search in Rotated Sorted Array 搜索旋转排序数组 python实现

    题目描述: python实现 Search in Rotated Sorted Array 搜索旋转排序数组   中文:假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1 ...

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

  7. lintcode:Recover Rotated Sorted Array恢复旋转排序数组

    题目: 恢复旋转排序数组 给定一个旋转排序数组,在原地恢复其排序. 样例 [4, 5, 1, 2, 3] -> [1, 2, 3, 4, 5] 挑战 使用O(1)的额外空间和O(n)时间复杂度 ...

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

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

随机推荐

  1. Region在connection前后进行“交并差”等操作的异同

    connection直译为“连接”.其实它的功能不是连接,它的功能是确定区域之间的连接关系,如果简单粗暴地解释的话,可以认为:connection的意思是“打散”,将不连接的区域打散成一个一个的区域. ...

  2. 光源 材质 简析——基于《real time rendering》第三版 第五章

    对于真是世界的渲染,有三个重要的组成部分,光源,材质,以及摄像机.下面,我们一个一个来简单介绍一下. 光源:方向光,点光源,聚光灯.但是,在和物体表面交互的时候,光源对物体表面的影响是依赖光的辐照度( ...

  3. Java 设计模式系列(十一)享元模式

    Java 设计模式系列(十一)享元模式 Flyweight 享元模式是对象的结构模式.享元模式以共享的方式高效地支持大量的细粒度对象. 一.享元模式的结构 享元模式采用一个共享来避免大量拥有相同内容对 ...

  4. JAVA array,map 转 json 字符串

    public class User { private String username; private String password; public String getUsername() { ...

  5. 项目中使用WCF替换asmx Web service总结

    以前项目解决方案中,用http协议的asmx Web service作服务器数据访问入口,在SoapHeader中写入用户名和加盐密码进行身份认证. http asmx服务是明文传输,传输过程中数据很 ...

  6. (并查集 带关系)Find them, Catch them -- poj -- 1703

    链接: http://poj.org/problem?id=1703 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 3676 ...

  7. (DP)uva 10036 Problem C: Divisibility

    链接: http://acm.hust.edu.cn/vjudge/contest/view.action?cid=88171#problem/F 代码: #include <cstdio> ...

  8. 23 DesignPatterns学习笔记:C++语言实现 --- 1.2 AbstractFactory

    23 DesignPatterns学习笔记:C++语言实现 --- 1.2 AbstractFactory 2016-07-21 (www.cnblogs.com/icmzn) 模式理解  

  9. uva 10169 - Urn-ball Probabilities !(概率)

    题目链接:uva 10169 - Urn-ball Probabilities ! 题目大意:在一个箱子中,原本有1个红球,然后任意取出(有放回)一个球,然后再往里放一个白球(每次取都要放进一个白球) ...

  10. Tempdb--TempDB Basic

    1. TempDB只能运行在Simple Recovery Model下 2. 由于TempDB不需要Recovery,因此在TempDB中发生的操作不需要REDO,因此在日志记录上有别于其他数据库. ...