一、何時可以使用「二分答案」
不是任何題目都適合使用「二分答案」的,我sam觀察到一般有以下的一些特徵:
a. 候選答案必須是離散的 ,且已知答案的範圍是:[最小值min, 最大值max] (連續區間上不能進行二分操作)
例如,在題目「kth largest 第k大的數」中 ==> 答案是閉區間[a[1]b[1], a[n]b[n]]上的正整數
例如,在題目「drying 烘乾衣服」中 ==> 烘乾時間t∈[0,maxt], maxt=max
b. 候選答案在區間[min,max]上某種屬性一類一類的排列 (這樣就能在此屬性上進行二分操作 ),各個類別不交錯混雜
例如,在題目「kth largest 第k大的數」中 ==>
(候選答案)第k大的數的值: a[1]b[1], ... , a[n]b[n]
(屬性分類)>這個乘積的數有多少: n^2-1 ... 0
例如,在題目「drying 烘乾衣服」中 ==>
(屬性分類)能否烘乾: 不能 不能 不能 能 ... 能 能
c. 容易判斷某個點 是否為答案(即二分過程中,mid指向的點是否為答案)
例如,在題目「kth largest 第k大的數」中 ==> λ∈[ a[1]b[1], a[n]b[n] ]
對於某個候選答案,如果「>λ的乘積個數"λ-1的乘積個數」≥k ,則答案為λ
例如,在題目「drying 烘乾衣服」中 ==>
需要尋找第乙個出現的「能」(true),即如果check(mid-1)==false && check(mid)==true ,則答案為mid.
【題目描述】:輸入n個數(0**:
1 #include2 #include34using
namespace
std;56
#define n 200000+10078
intn,m,sum;
9int
a[n];
1011
bool found(int
k)12
20return1;
21}2223
intmain()
2435 printf("
%d",l-1
);36
return0;
37 }
二分查詢簡單題
leetcode 35.search insert position 最普通的binary search,若target存在,則返回所在下標 若target不存在,則返回target待插入的位置,本質上就是實現lower bound函式 無論mid left right left 2,還是mid l...
二分查詢與二分答案
主要用於在乙個單調的函式中查詢某值 連續函式的情況 若當前查詢的區間是 l,r 查詢的值是 y 函式單增 設 mid l r 2 若 f mid y 則 l mid,否則 r mid 直至 r l eps 當前查詢的區間是 l,r 查詢的值是 y 函式單增 設 mid l r 2 若 f mid y...
二分查詢和二分答案
1.解釋 優點 查詢速度快。缺點 待查表為有序表。4.時間複雜度 o log n 5.示例 p2249查詢 include include using namespace std long long n,m,a 1000005 b 100005 l,r,mid,cnt,x intmain for i...