4/23
講師:吳崇維(wayne)
給你一個陣列,並在裡面選取三個數字 (可以重複)
請輸出共有幾種可能使三個數字的和為 0 ?
Example
3
0 1 -1
Ans : 兩種:三個0以及0, 1, -1
注意!此題難點在於 0, 1, -1 與 0 -1, 1 是同一種情況 (順序不影響)
Binary Search
對於此概念,我們先前已經有初步的認識及演算。
其實就是一直對半尋找,每次都刪除掉一半的可能性!
一例解千文,我們看看最簡單的二分搜code !
int arr[10] = {-5, 2, 6, 10, 15, 100, 110, 120, 130, 140};
// 注意!陣列一定要是排序過的
int target = 120;
int l = 0, r = 10;
// 我們的搜索範圍要一直控制在 arr[l] ~ arr[r-1] 裡面 , arr[r] 本身是在範圍外!
while (r - l > 1) {
int m = (l+r) / 2;
if (arr[m] == target) {
ans = l;
break;
} else if (arr[m] < target) {
l = m;
} else {
r = m;
}
}
Step 1. 決定搜索範圍:L ~ R
Step 2. 決定哪邊是開區間
Step 3. 直接使用上面的code
比如說:下面陣列我要尋找最左邊的 7,那是左邊還是右邊要開呢
1 1 1 2 7 7 7 8 8 9 9
現在給你一個特別的陣列:
他會先上升再落下,例如
1 3 5 7 9 10 5 3 2 1
並且在兩側都有一個要求找尋的值:例如3
請使用二分搜在兩側各找到要求的值的所在!
Example
10
1 3 5 7 9 10 5 3 2 1
5
3
Output : 1 7
我們如何儲存一張圖?
一起努力快樂寫程式吧!