二分查找法變形之二分答案——如何根據(jù)答案去求答案

二分法有樸素二分棉圈、特殊二分吭敢、二分答案。今天這篇說一下二分答案的具體問題和思路缭受。只有答案有序時(shí)才可以這么用哦


image.png

image.png
//#389 暴躁的程序猿
//把暴躁的n個(gè)程序員安排在m個(gè)工位中胁澳,根據(jù)它們的編號(hào)和工位數(shù)求他們之間的最大距離
//員工編號(hào) 1 2 8 4 9
//員工編號(hào)排序1 2 4 8 9
//距離d = 1 ,工位m = 5
//距離d = 2 ,工位m = 3,1 4 8或 1 4 9兩種情況
//距離d = 3 ,工位m = 3
//距離d = 4 ,工位m = 2, 1 8, 1 9, 2 8, 2 9, 4 8, 4 9 六種情況
//距離d = 5 ,工位m = 2, 1 8, 1 9, 2 8, 2 9
//距離d = 6 ,工位m = 2, 1 8, 1 9, 2 8, 2 9
//距離d = 7 ,工位m = 2, 1 8, 1 9
//距離d = 8 ,工位m = 2, 1 9
//距離d = 9... ,工位m = 1,就隨便找一個(gè)人坐
//距離d可以無限大,工位m為1的時(shí)候
//假設(shè)距離已知米者,給一個(gè)距離韭畸,對(duì)應(yīng)一個(gè)工位,隨距離增大工位數(shù)減小
//距離是從1到  最大編號(hào)和最小編號(hào)的差
//給你m讓你求最大的距離d
//不好求這個(gè)問題蔓搞,但是給一個(gè)d能算出分配的工位數(shù)m
//可以根據(jù)d先求出這個(gè)m數(shù)陆盘,再和題目比較“苊鳎可能會(huì)有一堆d滿足。
//d的范圍 是從1到  最大編號(hào)和最小編號(hào)的差 太防,怎樣在這一堆數(shù)里挑一個(gè)合適的d呢

//即有一堆滿足條件的d妻顶,找出最后一個(gè)滿足條件的d
//最后一個(gè)1前面的情況屬于func(d) > = m,后面的情況屬于func(d) < m
//滿足條件看成1,不滿足看成0
//抽象成一個(gè)1111000的問題蜒车,找用二分法找一個(gè)d,讓它恰巧等于m

//如果m比題目給定的小讳嘱,說明你的距離偏大,應(yīng)該動(dòng)右邊的指針
//如果和題目相等酿愧,也應(yīng)該動(dòng)左邊的指針沥潭,看看后邊是否有滿足條件的d,如果有的話選后邊那個(gè)
//如果比題目給的大嬉挡,說明你的距離偏小钝鸽,應(yīng)該動(dòng)左邊的指針

/*二分查找的兩種特殊情況的解決方法
0001111 找第一個(gè)1
while (l != r) { //(l<r)
    int mid = (l + r) / 2;
    if (mid == 0) { //
        l = mid + 1;
    } else {
        r = mid;//因?yàn)橛疫叺臄?shù)可能就是第一個(gè)1
    }
}

1111000 找最后一個(gè)1
while (l != r) {
    int mid = (l + r + 1) / 2;
    //避免為待比較數(shù)據(jù)個(gè)數(shù)為偶數(shù)(可能剛開始就是偶數(shù),也可能循環(huán)到某一次變?yōu)榕紨?shù)庞钢,且前一個(gè)值滿足if條件時(shí)拔恰。比如后面例子m = 2的 情況) 如1 0出現(xiàn)死循環(huán)的情況
    if (mid == 1) { 
        l = mid;
    } else {
        r = mid - 1;
    }
}
*/

#include <iostream>
#include <algorithm>
using namespace std;

int n, m, num[10005], str;

//求一下能安排多少人
int func(int d) {
    int s = 1, last = num[0];
    //無論d是幾,都可以在在num[0]放一個(gè)人 last記錄上個(gè)人的位置是哪
    //把每個(gè)員工都掃一遍基括,不需要記錄它們的位置
    for (int i = 1; i < n; i++) {
        if (num[i] - last >= d) {
            s++;
            last = num[i];
        }
    }
    return s;
}

int main() {
    cin >> n >> m;
    for (int i = 0; i < n; i++)  [
        cin >> num[i];
        tr = max(tr, num[i]);
        //最大的程序員的編號(hào)
    ]
    
    sort(num, num + n);
    int l = 1, r = tr;//這里把范圍給到了最大編號(hào)颜懊,可能會(huì)多比較幾次
    while (l != r) {
        int mid = (l + r + 1) / 2;
        int s = func(mid);
        if (s >= m) { //已知m,算一個(gè)距離
            l = mid;
        } else {
            r = mid -1;
        }
    }
    cout << l << endl;
    return 0;
}

為了防止溢出风皿,mid = (l + r) / 2河爹,可替換為mid = l + (r - l) / 2 ,java中可換為mid = (low + high) >>> 1
詳細(xì)解釋見https://leetcode-cn.com/problems/guess-number-higher-or-lower/solution/shi-fen-hao-yong-de-er-fen-cha-zhao-fa-mo-ban-pyth/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末桐款,一起剝皮案震驚了整個(gè)濱河市咸这,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌魔眨,老刑警劉巖炊苫,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件裁厅,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡侨艾,警方通過查閱死者的電腦和手機(jī)执虹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來唠梨,“玉大人袋励,你說我怎么就攤上這事〉卑龋” “怎么了茬故?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)蚁鳖。 經(jīng)常有香客問我磺芭,道長(zhǎng),這世上最難降的妖魔是什么醉箕? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任钾腺,我火速辦了婚禮,結(jié)果婚禮上讥裤,老公的妹妹穿的比我還像新娘放棒。我一直安慰自己,他們只是感情好己英,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布间螟。 她就那樣靜靜地躺著,像睡著了一般损肛。 火紅的嫁衣襯著肌膚如雪厢破。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天治拿,我揣著相機(jī)與錄音溉奕,去河邊找鬼。 笑死忍啤,一個(gè)胖子當(dāng)著我的面吹牛加勤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播同波,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼鳄梅,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了未檩?” 一聲冷哼從身側(cè)響起戴尸,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎冤狡,沒想到半個(gè)月后孙蒙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體项棠,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年挎峦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了香追。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡坦胶,死狀恐怖透典,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情顿苇,我是刑警寧澤峭咒,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站纪岁,受9級(jí)特大地震影響凑队,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜幔翰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一漩氨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧导匣,春花似錦、人聲如沸茸时。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽可都。三九已至缓待,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間渠牲,已是汗流浹背旋炒。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留签杈,地道東北人瘫镇。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像答姥,于是被迫代替她去往敵國(guó)和親铣除。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355