首页 > 编程语言 > 详细

28.earch in Rotated Sorted Array(排序旋转数组中查找)

时间:2019-04-30 18:41:15      阅读:114      评论:0      收藏:0      [点我收藏+]

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(排序旋转数组中查找)

原文:https://www.cnblogs.com/yjxyy/p/10797586.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!