774. Minimize Max Distance to Gas Station

Minimize Max Distance to Gas Station

On a horizontal number line, we have gas stations at positions stations[0], stations[1], ..., stations[N-1], where N = stations.length.

Now, we add K more gas stations so that D, the maximum distance between adjacent gas stations, is minimized.

Return the smallest possible value of D.

Example:
Input: stations = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], K = 9
Output: 0.500000

Note:

  1. stations.length will be an integer in range [10, 2000].
  2. stations[i] will be an integer in range [0, 10^8].
  3. K will be an integer in range [1, 10^6].
  4. Answers within 10^-6 of the true value will be accepted as correct.

方法1:
其實(shí)類似于[LeetCode]Split Array Largest Sum

相鄰加油站間距的最大值為x, 用dp[i][j]表示有i個interval(i+1)個加油站,額外增加j個甫煞,然后對于所有的k<j,對應(yīng)的x的最小值

  • dp[i][j] = min(max(dp[i - 1][j - k], (stations[i] - stations[i - 1]) / (k + 1)))
  • base case: dp[i][0] = max(stations[1] - stations[0], ..., stations[i] - stations[i - 1])

dp[i-1][j-k] j-k個附加的加油站分布在前i-1個區(qū)間,于是剩下的stations[i] - stations[i - 1]共享k個

for all k<j: 算得最小的距離

class Solution {
public:
    int splitArray(vector<int>& nums, int m) {
        int len = nums.size(), sum = 0;
        //dp[i][j] represents minimum largest sum by dividing first i characters into j subarrays
        //dp[i][j] = min(max(dp[k][j - 1], sum(k + 1, i)))
        //base case: dp[i][1] = presum[i] - 0(since we need to get dp[k][j - 1] when calculate dp[i][j]), dp[i][0] = INT_MAX, dp[0][i] = INT_MAX;
        vector<vector<int>> dp(len + 1, vector<int>(m + 1, INT_MAX));
        vector<int> preSums(1, 0);
        for(auto& num : nums){sum += num;preSums.push_back(sum);};
        for(int i = 0; i < len; ++i)
        {
            dp[i + 1][1] = preSums[i + 1] - preSums[0];
            for(int j = 2; j <= min(i + 1, m); ++j)
            {
                for(int k = i; k >= j - 1; --k)
                {
                    dp[i + 1][j] = min(max(dp[k][j - 1], preSums[i + 1] - preSums[k]), dp[i + 1][j]);
                }
            }
        }
        return dp[len][m];
    }
};

方法2:
對于搜索類的題目忿项,如果我們知道答案ans所在的區(qū)間[lo, hi]窃这,并且給定一個值y,我們有比較效率的算法可以驗(yàn)證y是否是ans的上/下界槽华,那么通常binary search都是值得考慮的算法壹蔓。這一題也是同樣,顯然我們知道答案是在[max(array[i]), sum(0, n - 1)]區(qū)間中猫态,并且給定y佣蓉,我們有O(n)的算法可以驗(yàn)證y是否是答案ans的上/下界:

  • 我們從頭開始切分array,每一次我們找到當(dāng)前區(qū)間和小于y的最大值所對應(yīng)的區(qū)間亲雪,如果最后切分的區(qū)間數(shù)d > m勇凭,那么我們知道y是ans的下界,因?yàn)閥可以更大從而d可以更小匆光,也就是代表ans >= y
  • 如果d <= m套像,顯然我們應(yīng)該減小y讓其能切分更多的subarray,也就是說y是ans的上界终息,ans <= y

根據(jù)以上條件我們就可以采用binary search的解法來解決這道題夺巩,時間復(fù)雜度O(n * log(sum))贞让,常數(shù)空間,代碼如下:

class Solution {
    public double minmaxGasDist(int[] st, int K) {
        int count = 0, N = st.length;
        double left = 0, right = st[N-1] - st[0], mid;
        
        while(left+1e-6<right){
            mid = left + (right-left)/2;
            count = 0;
            for(int i=0; i<N-1; i++){
                count += Math.ceil(   (st[i+1] - st[i])/mid   ) - 1;
            }
            if(count>K) right = mid;
            else left = mid;
        }
        return right;
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末柳譬,一起剝皮案震驚了整個濱河市喳张,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌美澳,老刑警劉巖销部,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異制跟,居然都是意外死亡舅桩,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門雨膨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來擂涛,“玉大人,你說我怎么就攤上這事聊记∪雎瑁” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵排监,是天一觀的道長狰右。 經(jīng)常有香客問我,道長舆床,這世上最難降的妖魔是什么棋蚌? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮挨队,結(jié)果婚禮上附鸽,老公的妹妹穿的比我還像新娘。我一直安慰自己瞒瘸,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布熄浓。 她就那樣靜靜地躺著情臭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪赌蔑。 梳的紋絲不亂的頭發(fā)上俯在,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機(jī)與錄音娃惯,去河邊找鬼跷乐。 笑死,一個胖子當(dāng)著我的面吹牛趾浅,可吹牛的內(nèi)容都是我干的愕提。 我是一名探鬼主播馒稍,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼浅侨!你這毒婦竟也來了纽谒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤如输,失蹤者是張志新(化名)和其女友劉穎鼓黔,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體不见,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡澳化,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了稳吮。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缎谷。...
    茶點(diǎn)故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖盖高,靈堂內(nèi)的尸體忽然破棺而出慎陵,到底是詐尸還是另有隱情,我是刑警寧澤喻奥,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布席纽,位于F島的核電站,受9級特大地震影響撞蚕,放射性物質(zhì)發(fā)生泄漏润梯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一甥厦、第九天 我趴在偏房一處隱蔽的房頂上張望纺铭。 院中可真熱鬧,春花似錦刀疙、人聲如沸舶赔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽竟纳。三九已至,卻和暖如春疚鲤,著一層夾襖步出監(jiān)牢的瞬間锥累,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工集歇, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留桶略,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像际歼,于是被迫代替她去往敵國和親惶翻。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評論 2 353

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