二分查詢進階——迴圈有序陣列查詢
阿新 • • 發佈:2019-01-02
(此題出自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 become4 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.
題目大意是給定一個迴圈有序陣列,讓你查詢其中的某個元素。最開始想到的當然是暴力求解了,即整個陣列遍歷一遍。當然這樣效率不高。既然這個陣列是有序的,我們應該嘗試著用其他方法解決它,比如今天的二分查詢。
令人頭疼的當然是如何確定二分查詢的邊界了!
int search(int* nums, int numsSize, int target) { int first = 0; int last = numsSize - 1; while (first <= last) { int mid = (last - first) / 2 + first; if (*(nums + mid) == target) //找到target return mid; else if (*(nums + first) <= *(nums + mid)) { if (*(nums + first) <= target && target < *(nums + mid)) last = mid - 1; else first = mid + 1; } else { if (*(nums + mid) < target && target <= *(nums + last)) first = mid + 1; else last = mid - 1; } } return -1; //未找到 }
由於陣列是迴圈有序的,並且每次求取的mid位置不確定,所以要進一步判斷要查詢的數在不在當前的 [first,mid] 或是 [mid,right] 區間裡,進而才能確定下一步的邊界。
只要弄清楚了邊界是如何確定的,這道題就迎刃而解了!