【Leetcode】81.(Medium)Search in Rotated Sorted Array II

解题思路:
首先用指针修剪一下数组去掉重复的数字,方面后面处理。
然后将数组一分为二,可以得到一半有序的子数组和一半有pivot的子数组。
然后该递归的递归,该二分查找的二分查找。

这道题的另外一种处理方式是在判断哪半边的数组是有序的时候,如果遇到nums[mid]==nums[left]的情况时,就left++,然后继续进行判断。


提交代码:

class Solution {
	public boolean search(int[] nums, int target) {
		if(nums.length==0)	return false;
		
		// shave the nums
		int p1=0;
		for(int i=1;i<nums.length;i++) {
			if(nums[i]==nums[i-1])
				continue;
			nums[++p1]=nums[i];
		}
		
		return findTarget(0, p1, nums, target);
	}

	public boolean findTarget(int left, int right, int[] nums, int target) {
		if (left > right)
			return false;
		if (nums[left] == target || nums[right] == target)
			return true;

		int mid = (left + right) / 2;
		if (nums[mid] == target)
			return true;

		// the left is sorted
		if (nums[mid] > nums[left]) {
			if (nums[left] > target || nums[mid] < target)
				return findTarget(mid + 1, right, nums, target);
			else { // binary sort
				right=mid;
				while (left <= right) {
					mid = (left + right) / 2;
					if (target == nums[mid])
						return true;
					if (target < nums[mid])
						right = mid - 1;
					else
						left = mid + 1;
				}
				return false;
			}
		} else {  // the right is sorted
			if (nums[mid] > target || nums[right] < target)
				return findTarget(left, mid-1, nums, target);
			else { // binary sort
				left=mid;
				while (left <= right) {
					mid = (left + right) / 2;
					if (target == nums[mid])
						return true;
					if (target < nums[mid])
						right = mid - 1;
					else
						left = mid + 1;
				}
				return false;
			}
		}

	}

}

运行结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/AXIMI/article/details/84426291
今日推荐