Leetcode 33. Search in Rotated Sorted Array

题目如下:

Suppose an array sorted in ascending order 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.

即对于一个原始的非递减非重复序列,在某处旋转后变成两段有序区,左边区域值较大,右边区域值较小,给定一个target求其位置。

对于有序序列问题一般就是二分查找。

设区间a[low,high],其中间位置mid=(low+high)/2,下面分情况讨论:

1 target==a[mid]返回mid即可;

2 when a[low]<a[high],说明该区间已经是有序区,按照常见的有序区二分即可:

    if target>a[mid],low=mid+1;

    if target<a[mid],high=mid-1;

3 when a[mid]>=a[low],由旋主序列特性可知,此时中间位置在左边较大的序列

    if target<a[low],说明target比左序区a[low...mid]值都小,low=mid+1;

    if target>a[mid],说明target比a[loq...mid]都要大,low=mid+1;

    else a[low]<=target<a[mid],high=mid-1;

4 when a[mid]<a[low],由旋主序列特性可知,此时中间位置在右边较小的序列

    if target>a[high],说明target比右序区a[mid...high]值都大,high=mid-1;

    if target<a[mid],说明target比a[mid...high]都要小,high=mid-1;

    else a[mid]<target<=a[high],low=mid+1;

int search(vector<int>& nums,int target){
    int low=0,high=nums.size()-1;
    int mid;
    while(low<=high){
	mid=(low+high)/2;
	if(target==nums[mid])return mid;
	if(nums[low]<nums[high]){if(target>nums[mid])low=mid+1;
	                         if(target<nums[mid])high=mid-1;
	                         }//low-high之间都是有序
	else{
	    if(nums[mid]>=nums[low]){
		if(target>nums[mid]||target<nums[low]) low=mid+1;
		else high=mid-1;
	                          }//mid处于左侧较大的有序区
	    else{
		if(target<nums[mid]||target>nums[high])high=mid-1;
		else low=mid+1;
	         }//mid处于右侧较小区域
	    }//Low-high之间是由两段有序区组成
                      }
    if(low==high&&nums[low]==target)return low;
    return -1;


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值