字節(jié)跳動(dòng)面試算法題 一堆火柴棒長(zhǎng)度的序列,切分成不下降的火柴棒長(zhǎng)度序列薯鳍,要求切割長(zhǎng)度最小 2020-04-13

[TOC]

同學(xué)問(wèn)我一個(gè)字節(jié)跳動(dòng)的面試的算法問(wèn)題

昨晚我的一個(gè)同學(xué)問(wèn)了我下面這個(gè)問(wèn)題咖气,說(shuō)是字節(jié)跳動(dòng)面試的題目:

一根火柴能拆成兩份,然后放在原處挖滤。
拆了的 還可以再拆
最后保證非下降
問(wèn) 最少要拆幾次
比如 3 5 13 9 12 變成 3 5 6 7 9 12崩溪。1次就好了


我的第一感覺(jué)是這個(gè)或許應(yīng)該可以線(xiàn)性復(fù)雜度解決,很有可能是有貪心策略的斩松。
首先想到的是伶唯,應(yīng)該從后面開(kāi)始掃起,因?yàn)榍懊娴幕鸩癜麸@然不能超過(guò)后面的火柴棒的長(zhǎng)度惧盹。

然后我發(fā)現(xiàn)來(lái)可能需要解決一個(gè)問(wèn)題乳幸,如果前面的火柴棒比后面的長(zhǎng)瞪讼,那么怎么切分它合適?

一個(gè)自然的想法是要讓最短的小棒盡可能長(zhǎng)粹断,這樣對(duì)于前面的小棒而言上限就更大一些符欠。顯然長(zhǎng)度上限越大越好(至少上限大的不會(huì)比上限小的差)。

但是姿染,我發(fā)現(xiàn)需要考慮一個(gè)問(wèn)題背亥,雖然這樣有利于前面的小棒切分?jǐn)?shù)盡可能少秒际,但是對(duì)當(dāng)前的方案來(lái)講悬赏,是否存在一種劃分方案,它切分的出來(lái)的最短小棒雖然更短一些娄徊,但是對(duì)于前面的小棒的限制效果是一樣的(比如最短長(zhǎng)棒盡可能長(zhǎng)可以達(dá)到10 闽颇,而另一種切分方案最短小棒是8,而前面的小棒長(zhǎng)度是7寄锐,那么10和8對(duì)于7的限制效果是一樣的)兵多,但是切分出來(lái)的小棒數(shù)目更少。

稍微一想橄仆,直覺(jué)上可以看出不存在這種情況剩膘。因?yàn)槿绻疃绦“舾痰那懈罘桨福庇X(jué)上就是切分的比較零碎盆顾,那么切分成的小棒數(shù)就不應(yīng)該更少怠褐。當(dāng)然,這個(gè)直覺(jué)上是對(duì)的結(jié)論沒(méi)有那么顯然您宪。所以奈懒,我后面的分析去證明了這個(gè)結(jié)論,即盡可能切的數(shù)目小的情況下宪巨,最短小棒越長(zhǎng)磷杏, 切分出來(lái)的小棒數(shù)越少。

所以問(wèn)題就變成了捏卓,知道小棒原始長(zhǎng)度和小棒長(zhǎng)度上限极祸,讓切分成的最短小棒長(zhǎng)度盡可能長(zhǎng),最短小棒可以是多長(zhǎng)怠晴,以及最少要切幾次贿肩。

于是就有了下面的子問(wèn)題A和子問(wèn)題B.


n=\sum_{i}^{k}{a_i} \quad (a_i \in N^{+})
則稱(chēng)a_1,a_2,\dots,a_kn的一種整數(shù)劃分。

子問(wèn)題A(a,b)

輸入a,b(b>a)龄寞。問(wèn)在b的所有劃分中汰规,要求劃分中的最大數(shù)不超過(guò)a,最小數(shù)最大可以是多少物邑。

即求滿(mǎn)足下式最大的c.
b=\sum_{i}^{k}{b_i} \quad \& \quad \max_{i}^{k}\{b_i\} \le a \quad \& \quad \min_{i}^{k}\{b_i\}=c

  1. b=ka \; \Rightarrow c=a.
  2. b=ka+r \; (1 \le r \ge a-1)
    1. k \ge (a-2).
      1. 顯然c=a-1.
      2. 先劃分成k根a和一根r的小棒溜哮,之后滔金,我們只需要將a-1-r \le a-2 \le k根a長(zhǎng)度的小棒每根截取1加到r這個(gè)小棒即可構(gòu)造出最小長(zhǎng)度為c=a-1 的劃分方案。
      3. a \nmid b \wedge b\ge (a-1)^2 \Rightarrow c=a-1.
    2. k < (a-2).c_0=\lfloor \frac茂嗓{k+1} \rfloor = b \; div \; (k+1),則c=c_0. 下為證明.
      1. \because b > ka.
        1. 所以拆分的小棒不可能少于k 根.
      2. 假設(shè)劃分成 p(p > k) 根小棒餐茵,最短的小棒c_1 > c_0.
        1. b \ge pc_1 \ge (k+1)(c_0+1).
        2. b=c_0 \cdot (k+1)+r_0 (0 \le r_0 < k+1) \rightarrow b < c_0 \cdot (k+1)+ (k+1)=(c_0+1)(k+1).
        3. 顯然矛盾。故不存在最小長(zhǎng)度大于c_0的方案述吸。
      3. 考慮劃分成k+1 根小棒.
        1. 注意有 b=c_0 \cdot (k+1)+r_0 (0 \le r_0 < k+1).
        2. k+1c_0 的小棒忿族,然后剩余的 r_0r_0 根小棒各自加1即可。
        3. 所以存在一種劃分方案最短長(zhǎng)度為c_0.

結(jié)論

返回c.


子問(wèn)題B(a,b,n)

假設(shè)拆分可以使用的數(shù)限于[a,b] 之間的正整數(shù)蝌矛,問(wèn)n 可否實(shí)現(xiàn)整數(shù)劃分道批,以及劃分的根數(shù)最小可以是多少?

討論可以拆分的數(shù) n 的情況:
\left[a,b \right] \\ \left[2a,2b \right] \\ \left[3a,3b \right] \\ \dots \\

kb \ge (k+1)a \quad(k \in N^{+}) \;\Rightarrow\; k \ge \lceil \frac{a}{b-a} \rceil = (b-1)\; div \; (b-a)

也就是說(shuō)k=(b-1)\; div \; (b-a),可由限于[a,b] 之間的正整數(shù)拆分表示的數(shù)落在以下有限個(gè)區(qū)間內(nèi)
\left[a,b \right] \\ \left[2a,2b \right] \\ \left[3a,3b \right] \\ \dots \\ \left[(k-1)a,(k-1)b \right] \\ \left[ka,+\infty \right] \\

另外,顯然入撒,假設(shè)長(zhǎng)度n可以由上述規(guī)則進(jìn)行整數(shù)拆分表示隆豹,則,如果n<=mb,則n一定可以劃分成的小棒數(shù)一定不超過(guò)成m根茅逮。如果(m-1)b<n<=mb則不但可以劃分成m根小棒璃赡,而且至少需要m根小棒才可以劃分。換句話(huà)說(shuō)可能存在多余m根小棒的劃分方案献雅,但是一定不存在小于m根的方案碉考,并且一定存在一種方案可以劃分成m根。

結(jié)論

n 可劃分挺身,劃分的最小根數(shù)d滿(mǎn)足(d-1)\cdot b < n \le d \cdot b,即 d=\lceil \frac{n}侯谁 \rceil = (n+b-1) \; div \; b.

返回是否可以劃分及d.


回到原問(wèn)題

輸入數(shù)組a[1..n].

算法

r=a[n] # 長(zhǎng)度上限
count = 0
for i = n downto 1
    if a[i] <= r
        r = a[i] # 更新長(zhǎng)度上限
        continue
    l = A(r) # 長(zhǎng)度下限
    ok, d = B(l,r,a[i]-l) // 事實(shí)上ok肯定是true,因?yàn)殚L(zhǎng)度下限是由子問(wèn)題A求出來(lái)的瞒渠。
    count += d
    r = l # 更新長(zhǎng)度上限
print(count)

正確性說(shuō)明

長(zhǎng)度為 n 的小棒,劃分長(zhǎng)度上限為r, 記l = A(n), d = 1 + B(l,r,n-l). 則根據(jù)以上關(guān)于子問(wèn)題A良蒸、B的討論知道一定存在一種劃分方案b_1,b_2,\dots,b_r0v5u1a \quad (b_1 = l \wedge b_i \ge l).

為了方便討論,不妨假設(shè)劃分方案中的數(shù)是不下降排列的伍玖,即\forall i(i<n) \Rightarrow b_i \le b_{i+1}.


假設(shè)存在一種劃分方案c_1,c_2,\dots,c_m (m < d).

由子問(wèn)題A可知c_1 \le b_1.

因?yàn)樽訂?wèn)題B是在限定了長(zhǎng)度上下限時(shí)嫩痰,求最小劃分根數(shù)。故有:

m-1 \ge B(c_1,r,n-c_1) = \lceil \frac{n-c_1}{r} \rceil \ge \lceil \frac{n-b_1}{r} \rceil = B(b_1,r,n-b_1) = d-1$. 即$m \ge d

顯然與假設(shè)m<d矛盾窍箍。

結(jié)論1

這就說(shuō)明劃分方案
b_1,b_2,\dots,b_ucijqql \quad (b_1 = l \wedge b_i \ge l)
既是最短的小棒盡可能長(zhǎng)的最佳方案串纺,又是劃分劃分小棒數(shù)盡可能少的最佳方案。


  1. 一方面椰棘,對(duì)于當(dāng)前小棒來(lái)講纺棺,劃分小棒數(shù)應(yīng)該盡可能小邪狞;

  2. 另一方面祷蝌,顯然劃分的最短小棒棒長(zhǎng)會(huì)作為前面的小棒的劃分上限,所以這個(gè)最短小棒越長(zhǎng)越好帆卓。

而結(jié)論1說(shuō)明我們的劃分方案在上面兩個(gè)方面努力的結(jié)果是一致的巨朦,所以我們可以采取算法所述的貪心措施米丘。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市糊啡,隨后出現(xiàn)的幾起案子拄查,更是在濱河造成了極大的恐慌,老刑警劉巖棚蓄,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件堕扶,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡梭依,警方通過(guò)查閱死者的電腦和手機(jī)稍算,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)睛挚,“玉大人邪蛔,你說(shuō)我怎么就攤上這事急黎≡” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵勃教,是天一觀的道長(zhǎng)淤击。 經(jīng)常有香客問(wèn)我,道長(zhǎng)故源,這世上最難降的妖魔是什么污抬? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮绳军,結(jié)果婚禮上印机,老公的妹妹穿的比我還像新娘。我一直安慰自己门驾,他們只是感情好射赛,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著奶是,像睡著了一般楣责。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上聂沙,一...
    開(kāi)封第一講書(shū)人閱讀 49,749評(píng)論 1 289
  • 那天秆麸,我揣著相機(jī)與錄音,去河邊找鬼及汉。 笑死沮趣,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的坷随。 我是一名探鬼主播房铭,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼漫贞,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了育叁?” 一聲冷哼從身側(cè)響起迅脐,我...
    開(kāi)封第一講書(shū)人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎豪嗽,沒(méi)想到半個(gè)月后谴蔑,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡龟梦,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年隐锭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片计贰。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡钦睡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出躁倒,到底是詐尸還是另有隱情荞怒,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布秧秉,位于F島的核電站褐桌,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏象迎。R本人自食惡果不足惜荧嵌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望砾淌。 院中可真熱鬧啦撮,春花似錦、人聲如沸汪厨。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)骄崩。三九已至聘鳞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間要拂,已是汗流浹背抠璃。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留脱惰,地道東北人搏嗡。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親采盒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子旧乞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容