33. Search in Rotated Sorted Array AND 81. Search in Rotated Sorted Array II

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.

int search(vector<int>& nums, int target) {
        int len = nums.size();
        if(len <= 0)
            return -1;
        
        int start = 0;
        int end = len-1;
        while(start < end)
        {
            int mid = start + (end - start) / 2;
            if(nums[mid] == target)
                return mid;
            else if(nums[start] <= nums[mid])
            {
                if(target >= nums[start] && target <= nums[mid])
                    end = mid - 1;
                else
                    start = mid + 1;
            }
            else
            {
                if(target >= nums[mid] && target <= nums[end])
                    start = mid + 1;
                else
                    end = mid - 1;
            }
        }
        
        return nums[start]==target ? start : -1;
    }



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?

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

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

The array may contain duplicates.

bool search(vector<int>& nums, int target) {
        int len = nums.size();
        if(len <= 0)
            return false;
        
        int start = 0;
        int end = len-1;
        while(start < end)
        {
            int mid = start + (end - start) / 2;
            if(nums[mid] == target)
                return true;
            if(nums[mid]>nums[end])
            {
              if(nums[mid]>target && nums[start] <= target) 
                end = mid;
              else 
                start = mid + 1;
            }
            else if(nums[mid] < nums[end])
            {
              if(nums[mid]<target && nums[end] >= target) 
                    start = mid + 1;
              else 
                    end = mid;
            }
            else
            {
              end--;
            }
        }
        
        return nums[start]==target ? true : false;
    
    }

bool search(vector<int>& nums, int target) {
        int len = nums.size();
        if(len <= 0)
            return false;
        
        int start = 0;
        int end = len-1;
        while(start < end)
        {
            int mid = start + (end - start) / 2;
            if(nums[mid] == target)
                return true;
            if(nums[start] < nums[mid])
            {
                if(target >= nums[start] && target < nums[mid])
                    end = mid - 1;//当nums[start]<=target<nums[mid时,此时只需要改变end,start不需要改变,所以if条件才这样设置
                else
                    start = mid + 1;
            }
            else if(nums[start] > nums[mid])
            {
                if(target > nums[mid] && target <= nums[end])
                    start = mid + 1;
                else
                    end = mid - 1;
            }
            else
                start++;
        }
        
        return nums[start]==target ? true : false;
    
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值