Leetcode初学——搜索选择排序数组

题目:

这道题的难点在于有一个旋转,并且规定我们时间复杂度是O(log n),这其实就是暗示我们用二分查找法做

代码如下:

class Solution {
    public int search(int[] nums, int target) {
        int start=0;
        int end=nums.length-1;
        int mid=0;
        //排除特殊情况
        if(end<0) return -1;
        if(end==0 && nums[0]==target) return 0;
        else if(end==0 && nums[0]!=target) return -1;

        //寻找翻转点
        for(int i=1;i<nums.length;i++){
            if(nums[i]<nums[i-1])
                mid=i-1;
        }
        //判断target所在范围
        if(target>=nums[start] && target<=nums[mid]){
            end=mid;
        }else if(target>=nums[mid+1]  && target<=nums[end]){
            start=mid;
        }else return  -1;
        while(start <= end){
            if(nums[mid] == target){
                return mid;
            }

            if(nums[start] <= nums[mid]){  //左边升序
                if(target >= nums[start] && target <= nums[mid]){//在左边范围内
                    end = mid-1;
                }else{//只能从右边找
                    start = mid+1;
                }

            }else{ //右边升序
                if(target >= nums[mid] && target <= nums[end]){//在右边范围内
                    start = mid +1;
                }else{//只能从左边找
                    end = mid-1;
                }

            }
            mid = start + (end-start)/2;
        }

        return -1;
    }
}

结果如下:

发布了57 篇原创文章 · 获赞 3 · 访问量 1076

猜你喜欢

转载自blog.csdn.net/qq_39377543/article/details/104127247