【LeetCode刷題】旋轉陣列的查詢 Search in Rotated Sorted Array
阿新 • • 發佈:2019-02-12
描述
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.
問題描述
給定一個旋轉陣列,它是一個排序陣列通過在一個未知的位置經過旋轉而來,需要在該旋轉陣列中查詢一個目標值,如果存在返回它的索引,如果不存在,返回-1。
分析
二分查詢,此題要特別注意邊界值。此題的邊界比較多。
(1)mid的位置判定,mid可能在左邊區域,也可能在右邊區域,需求通過(A[mid]與A[first]大小關係進行判定)
(2)在判定邊界時,要注意考慮大於,小於,等於三種情況,在寫程式碼時,本題我開始忘記了一個等號,如程式碼中標紅的地方。
(3)二分的思想是一步一步將區域縮小,並且要充分考慮縮小的正確性,不能放鬆對邊界的警惕(即要注意等於的情況)。
C++版程式碼
<span style="font-family:Microsoft YaHei;font-size:18px;">// 時間複雜度O(log n),空間複雜度O(1) class Solution { public: int search(int A[], int n, int target) { int first = 0, last = n; while (first != last) { const int mid = (first + last) / 2; if (A[mid] == target) return mid; if (A[first] <= A[mid]) { if (A[first] <= target && target < A[mid]) last = mid; else first = mid + 1; } else { if (A[mid] < target && target <= A[last-1]) first = mid + 1; else last = mid; } } return -1; } };</span>
JAVA版
轉載請註明出處!<span style="font-family:Microsoft YaHei;font-size:18px;">public int search(int[] A, int target) { if(A==null||A.length==0) return -1; int first=0,last=A.length-1; while(first<=last){ int mid=(first+last)/2; if(A[mid]==target){ return mid; }else if(A[mid]>=A[first]){ if(target>=A[first]&&target<A[mid]){ last=mid-1; }else{ first=mid+1; } }else{ if(target>A[mid]&&target<=A[last]){ first=mid+1; }else{ last=mid-1; } } } return -1; } </span>