GeekVan

导航

leetcode33

leetcode33

搜索旋转排序数组

来源:LeetCode

假设按照升序排序的数组在预先未知的某个点上进行了旋转。

( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。

搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。

你可以假设数组中不存在重复的元素。

你的算法时间复杂度必须是 O(log n) 级别。

示例 1:

输入: nums = [4,5,6,7,0,1,2], target = 0

输出: 4

示例 2:

输入: nums = [4,5,6,7,0,1,2], target = 3

输出: -1

code

二分搜索,如果数组必定有一边是有序的,有序的部分二分查找,无序部分继续分割。

class Solution {
public:
    int search(vector<int>& nums, int target) {
     return binary_search(nums,0,nums.size()-1,target);  
    }
    int binary_search(vector<int>&nums,int left,int right,int target){
        if(left>right)
            return -1;
        int mid=(left+right)/2;
        if(nums[mid]==target){
            return mid;
        }
        else{
            if(nums[mid]<nums[right]){//右边有序
                if(target>nums[mid]&&target<=nums[right]){
                   return binary_search(nums,mid+1,right,target);
                }
                else{
                    return binary_search(nums,left,mid-1,target);
                }
            }
            else{//右边无序,那么左边必定有序
                if(target<nums[mid]&&target>=nums[left]){
                    return binary_search(nums,left,mid-1,target);
                }
                else{
                    return binary_search(nums,mid+1,right,target);
                }

            }
        }
    }
};

posted on 2020-03-31 10:11  GeekVan  阅读(221)  评论(0编辑  收藏  举报