1. 程式人生 > 實用技巧 >【LeetCode/LintCode】 題解丨微軟高頻題:搜尋旋轉排序陣列

【LeetCode/LintCode】 題解丨微軟高頻題:搜尋旋轉排序陣列

假設有一個排序的按未知的旋轉軸旋轉的陣列(比如,0 1 2 4 5 6 7 可能成為4 5 6 7 0 1 2)。給定一個目標值進行搜尋,如果在陣列中找到目標值返回陣列中的索引位置,否則返回-1。你可以假設陣列中不存在重複的元素。

線上評測地址:點選此處前往

例1:

輸入: [4, 5, 1, 2, 3] and target=1, 
輸出: 2.

例2:

輸入: [4, 5, 1, 2, 3] and target=0, 
輸出: -1.

【題解】

演算法:二分

  • 根據題目我們可以知道旋轉陣列實際上是兩個遞增陣列的組成,且第一個陣列中的最小值大於第二個陣列的最大值
  • 由於陣列中不存在重複的元素,那麼我們可以先找到target在哪個陣列,再進行二分

程式碼思路

  1. 二分找到第二個陣列的起始位置,即整個陣列的最小值的位置minPosition
  2. 通過比較target和第二個陣列最小元素(即最後一個數)大小關係判斷target在哪一個陣列
  3. 對target所在的陣列二分

複雜度分析

N表示為 A 陣列的長度

  • 空 間複雜度:O(N)
  • 時間複雜度:O(logN)
public class Solution {
    /**
     * @param A: an integer rotated sorted array
     * @param target: an integer to be searched
     * @return: an integer
     */
    public int search(int[] A, int target) {
        if (A == null || A.length == 0) { 
            return -1; 
        } 
            
        //找到陣列最小值位置minPosition,即第二個陣列的起始位置
        int minPosition = 0; 
        intleft = 0; 
        int right = A.length - 1; 
        while (left + 1 < right) { 
            int mid = left + (right - left) / 2; 
            if (A[mid] > A[right]) { 
               left = mid; 
            } else { 
                right = mid; 
            } 
        }         
             
        if (A[left] < A[right]) { 
            minPosition = left; 
        } else { 
            minPosition = right; 
        } 
             
        //判斷target在哪一個陣列中
        if (A[A.length - 1] < target) { 
            left = 0; 
            right = minPosition - 1; 
        } else { 
            left = minPosition; 
            right = A.length - 1; 
        }
             
        //對target所在陣列二分搜尋
        while (left + 1 < right) { 
            int mid = left + (right - left) / 2; 
            if (A[mid] < target) { 
                left = mid; 
            } else { 
                right = mid; 
            } 
        }          
            
        if (A[left] == target) { 
            return left; 
        } 
        if (A[right] == target) { 
            return right; 
        }         
        return -1; 
    }
}

更多題解參見:九章演算法官網