leetcode算法练习【33】搜索旋转排序数组

所有题目源代码:Git地址

题目

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

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

方案:两次二分

  • 这里需要注意的是,它可能翻转,可能不翻转(比如以0节点作为翻转中心,那就相当于不翻转),所以需要考虑到这种情况
class Solution {
        public int search(int[] nums, int target) {
            if (nums.length==0)return  -1;
            if (nums.length==1) return nums[0]==target?0:-1;
            int start = 0;
            int end = nums.length-1;
            //找到那个翻转的节点
            while(start<end-1){
                int mid = start+(end-start)/2;
                if(nums[mid]<nums[start]) end = mid;
                else if(nums[mid]>=nums[start]) start = mid;
            }
            //获得了节点
            //效果是没有翻转的时候
            if (nums[start]<nums[end]){
                if (nums[0]>target||nums[nums.length-1]<target)return -1;
                return dicsearch(nums,0, nums.length-1,target);
            }
			//效果是翻转了的时候
            else if(nums[start]<target||nums[end]>target) return -1;
            else if(nums[0]<=target)return dicsearch(nums,0,start,target);
            else if (nums[nums.length-1]>=target)return dicsearch(nums,end,nums.length-1,target);
            else return -1;
        }
		//二分
        public int dicsearch(int[] nums,int first,int last,int target){
            if(first == last-1){
                if(nums[last]>target&&nums[first]<target)return -1;
                else if (nums[last]==target) return last;
                else if (nums[first]==target) return first;

            }
            int mid  = first+(last-first)/2;
            if(nums[mid] == target) return mid;
            else if (nums[mid]>target) return dicsearch(nums,first,mid,target);
            else if (nums[mid]<target)return dicsearch(nums,mid,last,target);
            return  -1;
        }
    }

复杂度计算
  • 时间复杂度:两次二分O(logn)
  • 空间复杂度:O(1)
原创文章 179 获赞 270 访问量 34万+

猜你喜欢

转载自blog.csdn.net/symuamua/article/details/105997853