分治法(實戰篇之二分查詢)

2022-07-27 09:30:13 字數 2037 閱讀 8125

啥也不說,先上題!!!

二分查詢

description

給你n個整數和乙個整數k。問:n個數中是否存在整數k,如果存在,輸出「yes」,否則輸出「no」。

input

輸入包含多組測試用例,對於每組測試用例:

輸入乙個數字n (1 <= n <= 10^7)

接下來輸入n個不同的數字ai( |ai| <= 10^7)。

接下來輸入整數k ( |k| <= 10^7)。代表要找的數字k

output

n個數中是否存在整數k,如果存在輸出「yes」,否則輸出「no」。每組資料佔一行。

sample input 1

5

-100 1 2 3 4

-100

51 2 3 5 6

4

sample output 1

yes

no看起來很簡單,對吧?

讓我們來小試牛刀一下!!!

first blood

我比著思想篇寫了二分法的**,執行著似乎沒啥問題,結果wa了

bool binary_search(int a, int lo, int hi, int

k)

else

else

if(a[mi] >k)

else

}}//分析複雜度:首先該函式在主函式中呼叫了 logn 次,

//該函式又在主函式的for迴圈裡(0~n-1)

//所以複雜度為nlogn

second  blood

超時??我明明把遞迴改成while迴圈了,神馬情況??

#include using

namespace

std;

int a[10000005

];//

bool binary_search(int a, int lo, int hi, int k)

//else

//else if(a[mi] > k)

//else

////}//

//}bool binary_search(int lo, int hi, int

k)

else

if(a[mi] >k)

else

}return

false;}

intmain()

intk;

cin >>k;

sort(a, a +n);

if(binary_search(0, n - 1

, k))

else

}return0;

}

經過一番思索.......

是不是卡時間,畢竟輸入輸出流比格式輸入輸出更耗時

此時我們需要 開 !外 !掛!// std::ios::sync_with_stdio(false);

#include using

namespace

std;

int a[10000005

];//

bool binary_search(int a, int lo, int hi, int k)

//else

//else if(a[mi] > k)

//else

////}//

//}bool binary_search(int lo, int hi, int

k)

else

if(a[mi] >k)

else

}return

false;}

intmain()

intk;

cin >>k;

sort(a, a +n);

if(binary_search(0, n - 1

, k))

else

}return0;

}

accept

快誇我!!!嘻嘻

分治法 二分查詢

1 首先二分查詢滿足分治法的四個條件 1 原問題的解可以通過分解為若干個小的問題來解決 將原陣列序列可分解為兩個子串行 2 小的問題的解決方法和原問題的解決方法大致相似 都是確定乙個序列的上界和下界然後求得mid進行比較 3 小問題的解可以通過合併從而得到原問題的解 在子串行中可以更容易得到解從而r...

分治法 二分查詢

問題描述 二分查詢又稱為折半查詢,它要求待查詢的資料元素必須是按關鍵字大小有序排列的。問題描述 給定已排好序的n個元素s1,sn,現要在這n個元素中找出一特定元素x。首先較容易想到使用順序查詢方法,逐個比較s1,sn,直至找出元素x或搜尋遍整個序列後確定x不在其中。顯然,該方法沒有很好地利用n個元素...

分治法 二分查詢

問題 給定已按公升序排好序的n個元素a 0 n 1 現要在這n個元素中找出一特定元素x,返回其 首次 出現的位置。雖說是老問題,但是並不可簡單忽視,網上有人說 十個二分九個錯 還是要好好梳理一下。問題一,區間開閉 設查詢區間左右端點為left與right,這兩個點其實開閉均可,一般統一用閉合。問題二...