天天看點

面試算法-螺旋數組查找值(JAVA實作)

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

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

搜尋一個給定的目标值,如果數組中存在這個目标值,則傳回它的索引,否則傳回 -1 。

你可以假設數組中不存在重複的元素。

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

  • 示例:
  • eg1: 輸入: nums = [4,5,6,7,0,1,2], target = 0 輸出: 4
  • eg2: 輸入: nums =[4,5,6,7,0,1,2], target = 3 輸出: -1

解題思路:

  1. 因為要求時間複雜讀是O(log n),首先想到的是使用二分查找的方法
  2. 如何利用螺旋數組的特點:

    一半有序,一半無序

  • 判斷目标值出現在有序的一半還是無序的一半
  • 如果在有序的一半,則二分查找有序數組
  • 如果在無序的一半,則在無序數組中重複前面的邏輯

樣例代碼:

public static void main(String[] args) {
        int[] input = new int[] { 4, 5, 6, 7, 0, 1, 2 };
        int target = 0;
        int re = findPos(input, 0, input.length - 1, target);
        System.out.println(re);
    }

    public static int findPos(int[] arr, int start, int end, int target) {
        if (arr.length == 0 || start > end)
            return -1;
        int pivot = (start + end) >> 1;
        if (target == arr[pivot])
            return pivot;
        if ((arr[start] < arr[pivot] && target >= arr[start]) || (arr[pivot] < arr[end] && target <= arr[end])) {
            if (target < arr[pivot]) {
                return findPos(arr, start, pivot - 1, target);
            } else {
                return findPos(arr, pivot + 1, end, target);
            }
        } else {
            if (arr[start] > arr[pivot]) {
                return findPos(arr, start, pivot - 1, target);
            } else {
                return findPos(arr, pivot + 1, end, target);
            }
        }
    }