81. 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

题意:基于33题的题意,如果数组中存在重复该如何处理。

思路:无重复时:

        二分查找的思路,从中间截取后一定会有一部分是有序的。
         左侧若有序,则右侧可能有序;左侧若无序,则右侧一定有序。
         判断左侧是否有序的方法是比较if (nums[left] <= nums[mid])。
         若左侧有序,此时target>nums[mid]则递归查找右侧,
         若target<nums[mid], 则比较target 与nums[left]的值,从而决定在哪里找target。

         有重复时:

         首先判断mid处是否相等,

         找到左侧第一个不是mid的数,若没找到,则说明左侧重复,直接从右半部分查找即可;

         若找到,判断左侧是否有序,并根据target是否在相应区间,搜索其对应部分。

class Solution {
public:
	bool search(vector<int>& nums, int target) {
		return binarySearch(nums, target, 0, nums.size() - 1);
	}

	bool binarySearch(vector<int>& nums, int target, int left, int right){
		while (left <= right){
			int mid = (left + right) / 2;
			if (target == nums[mid]){
				return true;
			}
			else {
				//judge the order
				while (left < mid && nums[left] == nums[mid]){
					left++;
				}
				if (left == mid){//left part all equal
					return binarySearch(nums, target, mid + 1, right);
				}
				else{
					if (nums[left] < nums[mid]){//left part oedered
						if (target < nums[mid] && target >= nums[left]){
							return binarySearch(nums, target, left, mid - 1);
						}
						else{
							return binarySearch(nums, target, mid + 1, right);
						}
					}
					else{//right part ordered
						if (target > nums[mid] && target <= nums[right]){
							return binarySearch(nums, target, mid + 1, right);
						}
						else{
							return binarySearch(nums, target, left, mid - 1);
						}
					}
				}
			}
		}
		return false;
	}
};


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值