(每日演算法)LeetCode,演算法)LeetCode
Search in Rotated Sorted Array I && II
Leetcode
對有序數組進行二分尋找(下面僅以非遞減數組為例):
int binarySort(int A[], int lo, int hi, int target)
{
while(lo <= hi)
{
int mid = lo + (hi - lo)/2;
if(A[mid] == target)
return mid;
if(A[mid] < target)
lo = mid + 1;
else
hi = mid - 1;
}
}
對有序的旋轉數組進行二分尋找:
eg. [7, 8, 9, 3, 4, 5, 6]
在數組中有且僅有一個 斷點 (數字由大變小)。
還是通過折半來實現,關鍵是如有巧妙的繞過這個斷點。
1.如果前半部分有序:
2.如果前半部分無序
也就是說,我們優先考慮有序的部分。
int search(int A[], int lo, int hi, int target)
{
while (lo <= hi)
{
int mid = (lo + hi) / 2;
if (A[mid] == target)
return mid;
if (A[lo] <= A[mid])
{
if (A[lo] <= target && target < A[mid])
hi = mid - 1;
else
lo = mid + 1;
} else {
if (A[mid] < target && target <= A[hi-1])
lo = mid + 1;
else
hi = mid - 1;
}
}
return -1;
}
對包含重複元素的旋轉數組進行二分尋找:
允許重複元素,則上一題中如果A[m]>=A[l],那麼[l,m]為遞增序列的假設就不能成立了,比如[1,3,1,1,1]。
如果A[m]>=A[l]不能確定遞增,那就把它拆分成兩個條件:
bool search(int A[], int lo, int hi, int target)
{
while (lo <= hi)
{
int mid = (lo + hi) / 2;
if (A[mid] == target)
return true;
if (A[lo] < A[mid])
{
if (A[lo] <= target && target < A[mid])
hi = mid - 1;
else
lo = mid + 1;
} else if(A[lo] > A[mid]) {
if (A[mid] < target && target <= A[hi-1])
lo = mid + 1;
else
hi = mid - 1;
}
else
lo++;
}
return false;
}