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.

    找到左右分界点,然后判断target是在前半段还是后半段,然后在相应的地方用二分法查找

    class Solution {
    public:
     
    bool binaryS(int A[], int min, int max, int &result, int target)
    {
         if(A[min] > target || A[max] <target) {    
            result = -1 ;
            return false ;
         }
         
         int mid;
          
         while(min <= max)
         {
            mid = min + (max-min) /2 ;
            if(A[mid] == target) {
                result = mid;
                return true;
            }
            if(A[mid] < target)
                min = mid + 1;
             else
                max = mid -1; 
         }
         result = -1;
        
         return false;
    }
        
    int search(int A[], int n, int target) {
            // Start typing your C/C++ solution below
            // DO NOT write int main() function
            int i,result;
    if(n < 2) { for(i = 0; i<n ; i++) if(A[i] == target) break; return i<n ? i: -1; } int min = 0,max = n-1 ,mid; while(min <= max) { mid = min + (max - min)/2 ; if(mid == 0 || mid == n-1) break; if(A[mid]<A[mid-1] && A[mid] <A[mid+1] ) break; else if(A[mid] <A[0]) max = mid ; else if(A[mid] >A[0]) min = mid + 1 ; } if(mid == 0) { if(A[0] > A[1]) mid = 1; else mid = -1 ; } if(mid == n-1) { if(A[n-1] >A[n-2]) mid = n ; } if( mid == -1 || mid == n ) binaryS(A, 0,n - 1, result, target) ; else if(target >= A[0]) binaryS(A, 0, mid - 1, result, target) ; else binaryS(A, mid, n-1, result, target); return result ; } };

     另外一种思路:

    class Solution {
    public:
        int search(int A[], int n, int target) {
            // Start typing your C/C++ solution below
            // DO NOT write int main() function
            if(A == NULL || n < 0) return -1;
            
            int left  = 0;
            int right = n-1;
            
            while(left <= right){
            
                int mid =  ((right - left)>>1) + left ;
                
                if(A[mid] == target)
                    return mid;
                if(A[mid] > A[right]){
                
                    if(target >= A[left] && target < A[mid])                
                        right = mid - 1;
                    else 
                        left = mid  + 1;
                }else{
                
                    if(target <= A[right] && target > A[mid])
                        left = mid + 1;
                    else
                        right = mid - 1;
                }
            }
            
            return -1;
        }
    };

     另一种思路:

    class Solution {
    public:
        int search(int A[], int n, int target) {
            // Start typing your C/C++ solution below
            // DO NOT write int main() function
            if(A == NULL || n < 0) return -1;
            
            int left  = 0;
            int right = n-1;
            
            while(left <= right){
            
                int mid =  ((right - left)>>1) + left ;
                
                if(A[mid] == target)
                    return mid;
                if(A[mid] > A[left]){
                
                    if(target >= A[left] && target < A[mid])                
                        right = mid - 1;
                    else 
                        left = mid  + 1;
                }else if(A[mid] < A[left]){
                
                    if(target <= A[right] && target > A[mid])
                        left = mid + 1;
                    else
                        right = mid - 1;
                }else{
                    if(target == A[left])
                            return left;
                    ++left;
                }
            }
            
            return -1;
        }
    };
    --------------------------------------------------------------------天道酬勤!
  • 相关阅读:
    fail to start File System Check
    qemu:///system 没有连接驱动器可用;读取数据时进入文件终点: 输入/输出错误
    [转载]libvirt(virsh命令总结)
    【转载】CentOS 7自动以root身份登录gnome桌面 操作系统开机后自动登录到桌面 跳过GDM
    Linux查看PCIe版本及速率# lspci -vvv |grep Width -i
    JAVA的线程能够在多个CPU上执行么?
    给定字典做分词
    POJ 3130 &amp; ZOJ 2820 How I Mathematician Wonder What You Are!(半平面相交 多边形是否有核)
    高仿一元云购IOS应用源代码项目
    增加收藏兼容主流浏览器代码
  • 原文地址:https://www.cnblogs.com/graph/p/3043223.html
Copyright © 2011-2022 走看看