【leetcode】Search in Rotated Sorted Array II

Follow up for "Search in Rotated Sorted Array":
What if duplicates are allowed?

Would this affect the run-time complexity? How and why?

Write a function to determine if a given target is in the array.


这个题目和上一个rotated arrary 一样,但是可能会出来一种情况,让A[mid]和A[left]和A[right]不好比较大小:

有可能多出来的情况是:1  1  1  3  1

因此要把A[mid]==A[left] 情况单独拿出来。

下面一段分析是copy的别人的:

在有序数组中查询一个值,二分法是一个通用解法。

但是此题的对有序数组进行了一个操作,使得原有序数组分成了两个部分。

原有序数组

A[0] < A[1] < A[2] < A[3] < A[4] < ... < A[N - 1]

Rotated后:

A[i] < A[i + 1] < ... < A[N - 1] > A[0] < A[1] < ... < A[i - 1]

方法依旧采用二分,假设现在我们要在A[l] ... A[r]中查询target。

1.A[l] < A[r],说明A[l] < A[l + 1] < A[l + 2] < ... < A[r]是一个部分有序数组,可以直接采用二分查询;

2.A[l] > A[r],说明存在一个k,使得A[l]到A[k],A[k+1]到A[r]为两个有序数组,此时我们还是用二分处理:

假设:mid = (l + r) / 2

如果A[mid] == target,则找到了target,否则在A[l]到A[mid - 1]与A[mid + 1]到A[r]两个部分搜寻目标值。



class Solution {
public:
	bool search(int A[], int n, int target) {
		return my_binary_search(A,0,n-1,target);
	}
private:
	bool my_binary_search(int A[],int left,int right,int target);
};

bool Solution::my_binary_search(int A[],int left,int right,int target){
	while (left<=right)
	{
		int mid=(left+right)/2;

		if (A[mid]==target)
		{
			return true;
		}
		if (A[left]<A[mid])
		{
			if (A[left]<=target&&target<A[mid])
				right=mid-1;
			else
				left=mid+1;

		}
		else if(A[left]>A[mid])
		{
			if (A[mid]<target&&target<=A[right])
				left=mid+1;
			else
				right=mid-1;
		}
		else if (A[left]==A[mid])
		{
			left=left+1;
		}
		
	}
	return false;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值