LeetCode 33 搜索旋转排序数组(java)

LeetCode 33 搜索旋转排序数组(java)

一、题目描述:

假设按照升序排序的数组在预先未知的某个点上进行了旋转。
例如:数组【0,1,2,3,4,5,6,7】可能变为【4,5,6,7,0,1,2】
搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回-1.
你可以假设数组中不存在重复的元素。
你的算法时间复杂度必须是O(log n)级别

二、示例:

LeetCode 33 搜索旋转排序数组(java)_第1张图片LeetCode 33 搜索旋转排序数组(java)_第2张图片

三、解题思路:

由于题目要求算法时间复杂度必须是O(log n)级别,所以不可以直接遍历数组。
不管给出的数组如何进行旋转,都是由有序数组组成,只不过是分为了两个小的有序数组,所以我们可以使用二分法。
定义双指针,分别指向数组的开头start和结尾end,再选取数组中间值min粗略将数组分为两个部分,进行判断:

  1. 用target和数组中间值mid进行比较,若相同则直接return mid
  2. 若不同则分别对两个小片段进行判断:在有序的小片段中判断target是否存在于此片段中,如果存在则将双指针定位于此片段中。若不存在,则将双指针定位于另一个片段里。
  3. 在更新过双指针的小片段中再次定位mid,重复以上方法,直到找到target或者返回-1.
四、代码如下:
class Solution {
    public int search(int[] nums, int target) {
        if(nums.length==0) return -1;
        int start =0;
        int end =nums.length-1;
        
        while (start<=end){
            
            int mid = (start+end)/2;
            
            if (target==nums[mid]) return mid;
            
            if(nums[start]<=nums[mid]){
                if(target>=nums[start]&&target<nums[mid]){
                    if(target==nums[start]) return start;
                    end=mid-1;
                }else {
                    start=mid+1;
                }
            }else{

                if(target>nums[mid]&&target<=nums[end]){
                    if(target==nums[end]) return end;
                    start=mid+1;
                }else {
                    end=mid-1;
                }
            }
            
        }
        return -1;
    }
}

你可能感兴趣的:(LeetCode,LeetCode,java)