啥也不說,先上題!!!
二分查詢
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
yesno看起來很簡單,對吧?
讓我們來小試牛刀一下!!!
first blood
我比著思想篇寫了二分法的**,執行著似乎沒啥問題,結果wa了
bool binary_search(int a, int lo, int hi, intk)
else
else
if(a[mi] >k)
else
}}//分析複雜度:首先該函式在主函式中呼叫了 logn 次,
//該函式又在主函式的for迴圈裡(0~n-1)
//所以複雜度為nlogn
second blood
超時??我明明把遞迴改成while迴圈了,神馬情況??
#include usingnamespace
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 usingnamespace
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,這兩個點其實開閉均可,一般統一用閉合。問題二...