33. Search in Rotated Sorted Array

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

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

class Solution {
public:
	int search(vector<int>& nums, int target) {
		return binarySearch(nums, target, 0, nums.size() - 1);
	}
	int binarySearch(vector<int>& nums, int target, int left, int right){
		while (left <= right){
			int mid = (left + right) / 2;
			if (target == nums[mid]){
				return mid;
			}
			else if (target < nums[mid]){
				//judge sorted
				if (nums[left] <= nums[mid]){
					//left part sorted
					if (target > nums[left]){
						//in left part
						return binarySearch(nums, target, left + 1, mid - 1);
					}
					else if (target < nums[left]){
						//in right part
						return binarySearch(nums, target, mid + 1, right);
					}
					else if (target == nums[left])
						return left;
				}
				else {
					//right part sorted
						return binarySearch(nums, target, left, mid - 1);
				}
			}
			else{
				//judge sorted
				if (nums[left] <= nums[mid]){
					//left part sorted
					return binarySearch(nums, target, mid + 1, right);
				}
				else {
					//right part sorted
					if (target < nums[right]){
						return binarySearch(nums, target, mid + 1, right - 1);
					}
					else if (target > nums[right])
						return binarySearch(nums, target, left, mid - 1);
					else
						return right;
				}
			}
		}
		return -1;
	}
};





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值