Loading

LeetCode 33 搜索旋转排列数组

LeetCode33 搜索旋转排列数组

题目描述

给你一个升序排列的整数数组 nums ,和一个整数 target

假设按照升序排序的数组在预先未知的某个点上进行了旋转。(例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。

请你在数组中搜索 target ,如果数组中存在这个目标值,则返回它的索引,否则返回 -1

样例

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

算法分析

  • 二分找旋转点,中点与末端点是保持单调性质(具体性质就是是否大于nums[0])
  • 确定是左还是右区间
    • >= nums[0] 左区间,<nums[0],右区间
  • 在区间内再次二分找target,找到返回左边,找不到返回-1

时间复杂度\(O(log(n))\)

Java代码

class Solution {
    public int search(int[] nums, int target) {
        if(nums.length == 0) return -1;

        //
        int l = 0, r = nums.length - 1;
        while( l < r ){
            int mid = l + r + 1 >> 1;
            if(nums[mid] >= nums[0]) l = mid;
            else r = mid - 1;
        }

        //找到左区间或者是右区间
        if(target >= nums[0]) l = 0;
        else{
            l = r + 1;
            r = nums.length - 1;
        }


        while(l < r){
            int mid = l + r >> 1;
            if(nums[mid] >= target ) r = mid;
            else l = mid + 1;

        }

        if(nums[r] == target ) return r;
        else return -1;
    }
}
posted @ 2020-11-01 15:41  想用包子换论文  阅读(79)  评论(0)    收藏  举报