奧林匹亞資訊班

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;
    }
}

二分搜SOP

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

今日目標

我們如何儲存一張圖?

FeedBack!

一起努力快樂寫程式吧!

二分搜

By Wayne Wu

二分搜

  • 39