搜索旋轉排序數組

假設按照升序排序的數組在預先未知的某個點上進行了旋轉。算法

( 例如,數組 [0,1,2,4,5,6,7] 可能變爲 [4,5,6,7,0,1,2] )。數組

搜索一個給定的目標值,若是數組中存在這個目標值,則返回它的索引,不然返回 -1 。spa

你能夠假設數組中不存在重複的元素。code

你的算法時間複雜度必須是 O(log n) 級別。排序

示例 1:索引

輸入: nums = [4,5,6,7,0,1,2], target = 0
輸出: 4
複製代碼

示例 2:get

輸入: nums = [4,5,6,7,0,1,2], target = 3
輸出: -1





class Solution {
    public int search(int[] nums, int target) {
        int left = 0 , right = nums.length - 1;
           while( left <= right ){
             int mid = ( left + right ) / 2;
             if( nums[ mid ] ==  target ) return mid;
             if( nums[ mid ] >= nums[ left ] ){
                 if( target < nums[ mid ] && target >= nums[ left ]){
                     right = mid - 1;
                 }else{
                     left = mid + 1;
                 }
             }else{
                 if( target < nums[ left ] && target > nums[ mid ]  ){
                     left = mid + 1;
                 }else{
                     right = mid - 1;
                 }
             }
        }
        return -1;
    }
   
}
複製代碼

解題思路: 對數組進行二分查找 , 由於是旋轉後的數組,因此須要分爲如下幾種狀況:一、mid的值等於目標值,返回 二、mid的值大於等於left值(即從left 到 mid爲正常遞增的序列) ,若是 目標值在 left - mid這個範圍中 , 則 right = mid - 1 ;不然 往mid + 1 - right 範圍查找 三、若是mid值小於left , 而且目標值小於left值且目標值大於當前mid值,往右邊找 ,不然往左邊找 。 注意邊界條件有=。io

相關文章
相關標籤/搜索