LeetCode Search in Rotated Sorted Array

本文介绍了一种在已排序数组被旋转后,快速查找特定目标元素位置的算法。通过首先找到数组的最小元素,从而确定旋转点,算法能够有效地在有序段内进行二分查找,同时处理数组长度为1的特殊情况,确保查找效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

Suppose a sorted array is rotated at some pivot unknown to you beforehand.

(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).

You are given a target value to search. If found in the array return its index, otherwise return -1.

You may assume no duplicate exists in the array.

题意:

给定一个已经排好序的数组,然后按照某个元素旋转,给定一个目标数字,求在这个旋转数组中出现这个目标数字的位置(下标),如果没有出现,那么返回-1,否则返回出现的下标。

题解:

采用和之前的搜索旋转数组的最小元素的方法,先找到那个最小的元素,用二分搜索找,找到这个元素也就意味着找到了分界点,这个最小元素左边的必定大于这个元素,而且已经排好序了,这个最小元素右边的必定也大于这个元素,而且也已经排好序了。但是为了防止出现超时现象,有几种特殊情况需要当心,首先是当这个数组的长度只为1,那么我们只要查看这个头元素是否等于target,如果相等,那么直接返回0,否则就返回-1,也就不用去执行了;如果找到这个最小元素的位置,也就是分界点,那么查看这个分界点的值是不是等于target,如果相等,直接返回这个分界点的位置(下标),否则如果这个分界点是0,那么只要做一遍二分搜索即可,否则对分界点两边都要做一遍二分搜索。

public int search(int[] nums,int target)
	{
		int length = nums.length;
		if(length == 1 && nums[0] == target)
			return 0;
		else if(length == 1 && nums[0] != target)
		    return -1;
		int min = searchBinary(nums,0,length - 1);
		if(nums[min] == target)
		    return min;
		if(min == 0)
		   return binary(nums,0,length - 1,target);
		System.out.println(min);
		if(binary(nums,0,min -1,target) != -1)
			return binary(nums,0,min -1,target);
		else if(binary(nums,0,min -1,target) == -1)
		{
			if(binary(nums,min,length - 1,target) != -1)
				return binary(nums,min,length - 1,target);
			else 
				return -1;
		}
		return -1;
	}
	public int searchBinary(int[] nums,int start,int end)
	{
		int length = nums.length;
		if(nums[start] < nums[end])
			return start;
		while(nums[start] >= nums[end])
		{
			if(start + 1 == end)
			    return end;
			int mid = (start + end) / 2;
			if(nums[mid] >= nums[start])
				start = mid;
			else if(nums[mid] <= nums[end])
				end = mid;
		}
		return end;
	}
	public int binary(int[] nums,int start,int end,int target)
	{
		if(start <= end)
		{
			int mid = (start + end) / 2;
			if(nums[mid] == target)
				return mid;
			if(nums[mid] < target)
				return binary(nums,mid + 1,end,target);
			else if(nums[mid] > target)
				return binary(nums,start,mid - 1,target);
		}
		return -1;
	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值