zoukankan      html  css  js  c++  java
  • LeetCode_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.

    三个招:前两个很简单,巧妙地是第三个。

    //方法一:分批次二分查找 ;查找出分割点需要时间O(n),总时间复杂度 O(n) 
    int BinaryResearch(int A[],int low,int high,int target)
    {
        int l = low;
        int h = high;
        while(l<=h)
        {
           int mid = (int)((h+l)/2);
           if(A[mid]==target) return mid;
           else if(A[mid]<target) l = mid+1;
           else h = mid-1;
        }
        return A[h]; 
    }
    int search1(int A[], int n, int target) {
       
         int index = 0;
         for(int i = 0;i<n-1;i++)
         {
           if(A[i]>A[i+1])
           {
             index = i;
             break;
           }
         }
         int a = BinaryResearch(A,0,index,target);
         int b = BinaryResearch(A,index+1,n-1,target);
         if(a==-1&&b==-1)
         return -1;
         else 
         return a==-1?b:a;
    }
    int search2(int A[], int n, int target) {
         //顺序查找 ,O(n)
         int index = -1;
         for(int i = 0;i<n;i++)
         {
         if(A[i]==target)
         {
            index = i;
         }}
         return index;
    }
    //完全的二分查找,O(logn) 
    int search3(int A[], int n, int target) {
         int left = 0;
         int right = n-1;
         while(left<=right)
         {
                int mid = (int)((left + right)/2);
                if(A[mid] == target) return mid;
                if(A[left]<A[mid])//A[mid]在前半部分
                {
                   if(target<A[mid]&&target>=A[left])
                   right = mid-1;
                   else left = mid+1; 
                } 
                else if(A[left]>A[mid])//A[mid]位于后半段 
                {
                   if(target>A[mid]&&target<=A[right])
                   left = mid+1;
                   else 
                   right = mid-1;
                }
                else left++; 
         }
         return -1;
         
    }


  • 相关阅读:
    FEniCS 1.1.0 发布,计算算术模型
    Piwik 1.10 发布,增加社交网站统计
    淘宝褚霸谈做技术的心态
    CyanogenMod 10.1 M1 发布
    Druid 发布 0.2.11 版本,数据库连接池
    GNU Gatekeeper 3.2 发布
    Phalcon 0.9.0 BETA版本发布,新增大量功能
    EUGene 2.6.1 发布,UML 模型操作工具
    CVSps 3.10 发布,CVS 资料库更改收集
    Opera 移动版将采用 WebKit 引擎
  • 原文地址:https://www.cnblogs.com/sunp823/p/5601440.html
Copyright © 2011-2022 走看看