LeetCode之33. Search in Rotated Sorted Array

395 阅读2分钟

题目

33. Search in Rotated Sorted Array

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

( 例如,数组 [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

方法1

解题思路

找出旋转数组中最小值位置,然后进行二分查找,时间复杂度O(log(n)+log(n)) --->>>O(log(n))

代码如下

public class SearchInRotatedSortedArray1 {
    public static void main(String[] args) {
        int[] nums = new int[]{1, 2, 4, 5, 6, 7, 0};
        int[] nums2 = new int[]{2, 4, 5, 6, 7, 0, 1};
        int[] nums3 = new int[]{4, 5, 6, 7, 0, 1, 2};
        int[] nums4 = new int[]{5, 6, 7, 0, 1, 2, 4};
        int[] nums5 = new int[]{6, 7, 0, 1, 2, 4, 5};
        int[] nums6 = new int[]{7, 0, 1, 2, 4, 5, 6};
        System.out.println(search(nums, 4));
        System.out.println(search(nums2, 4));
        System.out.println(search(nums3, 4));
        System.out.println(search(nums4, 4));
        System.out.println(search(nums5, 4));
        System.out.println(search(nums6, 4));
    }

    public static int search(int[] nums, int target) {
        int index = finMinIndex(nums);
        if (index == -1) {
            return -1;
        }
        //现在已经找到最小值了
        int li = searchByBin(nums,target,0,index-1);
        if(li!=-1){
            return li;
        }
        int ri = searchByBin(nums,target,index,nums.length-1);
        if(ri!=-1){
            return ri;
        }
        return -1;
    }

    //找出最小元素下标
    public static int finMinIndex(int[] nums) {
        if (nums == null || nums.length == 0) {
            return -1;
        }
        int l = 0;
        int r = nums.length - 1;
        while (l < r) {
            if (nums[l] < nums[r]) {
                return l;
            }
            int mid = l + ((r - l) >> 1); 
            if (nums[mid] > nums[r]) {
                l = mid + 1;
            } else r = mid;
        }
        return l;
    }

    //二分查找
    public static int searchByBin(int[] nums, int target,int l,int r) {
        if (nums == null || nums.length == 0) {
            return -1;
        }
        while (l <= r) {
            int mid = l + ((r - l) >> 1);
            if (nums[mid] == target) {
                return mid;
            } else if (target > nums[mid]) {
                l = mid + 1;
            } else
                r = mid - 1;
        }
        return -1;
    }
}