• Search in Rotated Sorted Array I&&II——二分法


    Search in Rotated Sorted Array I

    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.

    做完了Find Minimum in Rotated Sorted Array之后,对这题又发现了一种非常简单的做法。

    Find Minimum in Rotated Sorted Array的思路如下:

    当nums[left]<nums[right],说明数组没有旋转,是按升序排列的。可直接返回nums[left];

    当nums[left]<nums[mid],说明left至mid这段是按升序排列的,可令left=mid+1;

    当nums[left]>nums[mid],说明mid至right这段是按升序排列的,可令right=mid;

     那么这题的解法也就出来了,把数组分成两部分,那肯定是有一部分是有序的,另一部分是无序的,不管有序还是无序,都对其继续进行二分搜索,最终肯定都能得到有序的数组,不过这样做感觉就不是二分搜索了,因为每次并没有去掉一半。

    也是通过二分搜索来解决,先通过一个二分搜索找到旋转的点,再分别对前后两个有序数组使用二分搜索,思路很简单,代码也没自己写了。

    转:http://blog.csdn.net/zhangwei1120112119/article/details/16829309

    class Solution {
    public:
       
        int search_2(vector<int>& A, int L, int R, int target)  
        {  
            while(L<=R)  
            {  
                int mid=(L+R)>>1;  
                if(A[mid]>target)  
                {  
                    R=mid-1;  
                }  
                else if(A[mid]<target)  
                {  
                    L=mid+1;  
                }  
                else    return mid;  
            }  
            return -1;  
        }  
       
       
        int search(vector<int>& nums, int target) {  
            int n=nums.size();
            vector<int> A(nums);
            if(n == 0)  return -1;  
            if(n == 1)  
            {  
                if(A[0] == target)  return 0;  
                else    return -1;  
            }  
            if(n == 2)  
            {  
                if(A[0] == target)  return 0;  
                else if(A[1] == target) return 1;  
                else    return -1;  
            }  
            int L=0,R=n-2;  
            while(L<R)//[0,n-2]找一个比A[n-1]大的数  
            {  
                int mid=(L+R>>1)+1;  
                if(A[mid]>A[n-1])   L=mid;  
                else  R=mid-1;  
            }  
            int split=L;  
            if(A[L]<A[n-1]) split=n-1;  
            //[0,split],[split+1,n-1]  
            int ans;  
            ans=search_2(A,0,split,target);  
            if(ans!=-1) return ans;  
            if(split+1<=n-1)  
            {  
                return search_2(A,split+1,n-1,target);  
            }  
            return -1;  
        }
    };

    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.

    非常简单:

    class Solution {
    public:
        bool subSearch(vector<int>& nums,int left,int right,int target)
        {
            if(left>right)
                return false;
            if(nums[left]==target)
                return true;
            while(nums[left]==nums[right]&&left<right)
                   left++;
            if(left==right)
            {
                 if(nums[left]==target)
                     return true;
                 else 
                    return false;
            }
            int mid=(left+right)/2;
            if(nums[left]<nums[right])
            {
                if(nums[left]>target||nums[right]<target)
                    return false;
                else    
                {
                    if(target==nums[mid])
                        return true;
                    if(target>nums[mid])
                        left=mid+1;
                    else
                        right=mid;
                    return subSearch(nums,left,right,target);    
                }
                    
            }
            else 
                return subSearch(nums,left,mid,target)|| subSearch(nums,mid+1,right,target);
        }
        bool search(vector<int>& nums, int target) {
            int left=0;
            int right=nums.size()-1;
            return subSearch(nums,left,right,target);
        }
    };

      

  • 相关阅读:
    测试阅读量
    JS中的 length, var i = [1,2]; i[length], 与 i.length, i["length"]的区别
    微信小程序:button组件的边框
    mongo学习笔记
    C言语语法总结(随时更新)
    Vim 常用命令总结
    php 文件操作
    git常用命令
    递归方式转迭代方式
    ECMAScript6 ES6 ES2015新语法总结
  • 原文地址:https://www.cnblogs.com/qiaozhoulin/p/4578622.html
Copyright © 2020-2023  润新知