IOS 算法(中級(jí)篇) ----- 消滅怪物的最大數(shù)量

你正在玩一款電子游戲,在游戲中你需要保護(hù)城市免受怪物侵襲。給你一個(gè) 下標(biāo)從 0 開(kāi)始 且長(zhǎng)度為 n 的整數(shù)數(shù)組 dist ,其中 dist[i] 是第 i 個(gè)怪物與城市的 初始距離(單位:米)。
怪物以 恒定 的速度走向城市。給你一個(gè)長(zhǎng)度為 n 的整數(shù)數(shù)組 speed 表示每個(gè)怪物的速度,其中 speed[i] 是第 i 個(gè)怪物的速度(單位:米/分)。
怪物從 第 0 分鐘 時(shí)開(kāi)始移動(dòng)。你有一把武器,并可以 選擇 在每一分鐘的開(kāi)始時(shí)使用,包括第 0 分鐘。但是你無(wú)法在一分鐘的中間使用武器。這種武器威力驚人,一次可以消滅任一還活著的怪物。
一旦任一怪物到達(dá)城市,你就輸?shù)袅诉@場(chǎng)游戲。如果某個(gè)怪物 恰 在某一分鐘開(kāi)始時(shí)到達(dá)城市,這會(huì)被視為 輸?shù)?游戲,在你可以使用武器之前,游戲就會(huì)結(jié)束。
返回在你輸?shù)粲螒蚯翱梢韵麥绲墓治锏?最大 數(shù)量。如果你可以在所有怪物到達(dá)城市前將它們?nèi)肯麥?,返? n 。
n == dist.length == speed.length
1 <= n <= 105
1 <= dist[i], speed[i] <= 105

例子:

輸入:dist = [1,3,4], speed = [1,1,1]
輸出:3
解釋:
第 0 分鐘開(kāi)始時(shí),怪物的距離是 [1,3,4],你消滅了第一個(gè)怪物。
第 1 分鐘開(kāi)始時(shí),怪物的距離是 [X,2,3],你沒(méi)有消滅任何怪物。
第 2 分鐘開(kāi)始時(shí),怪物的距離是 [X,1,2],你消滅了第二個(gè)怪物。
第 3 分鐘開(kāi)始時(shí),怪物的距離是 [X,X,1],你消滅了第三個(gè)怪物。
所有 3 個(gè)怪物都可以被消滅。

輸入:dist = [1,1,2,3], speed = [1,1,1,1]
輸出:1
解釋:
第 0 分鐘開(kāi)始時(shí),怪物的距離是 [1,1,2,3],你消滅了第一個(gè)怪物。
第 1 分鐘開(kāi)始時(shí),怪物的距離是 [X,0,1,2],你輸?shù)袅擞螒颉?br> 你只能消滅 1 個(gè)怪物。

輸入:dist = [3,2,4], speed = [5,3,2]
輸出:1
解釋:
第 0 分鐘開(kāi)始時(shí),怪物的距離是 [3,2,4],你消滅了第一個(gè)怪物。
第 1 分鐘開(kāi)始時(shí),怪物的距離是 [X,0,2],你輸?shù)袅擞螒颉?br> 你只能消滅 1 個(gè)怪物。

解題思路:

貪心 + 排序

先補(bǔ)充個(gè)知識(shí)點(diǎn):

貪心算法:(又稱貪婪算法)是指,在對(duì)問(wèn)題求解時(shí),總是做出在當(dāng)前看來(lái)是最好的選擇。也就是說(shuō),不從整體最優(yōu)上加以考慮,算法得到的是在某種意義上的局部最優(yōu)解。

這道題我們按照題意硬翻譯的話不太好處理, 那么我們可以轉(zhuǎn)換下思路

首先因?yàn)橐恢泵恐还肢F初始距離dist[i], 初始速度speed[i], 那么消滅每個(gè)怪獸到達(dá)城市最小時(shí)間為: dist[i] / speed[i]

例如: 初始距離2, 速度1, 我們需要 2 / 1 = 2分鐘時(shí)候消費(fèi)怪獸, 對(duì)嗎? 這么想就錯(cuò)了!!! 2分鐘再開(kāi)火, 怪獸都騎到臉上了, 直接GG。要在1分鐘時(shí)候?qū)⑵湎麥?/p>

實(shí)際上最小消滅時(shí)間應(yīng)該為: (dist[i] - 1) / speed[i]

那么我們依次計(jì)算出每個(gè)怪獸應(yīng)該消滅最小時(shí)間time數(shù)組, 做一次正序排列

再依次循環(huán)time數(shù)組, 判斷time[i] - i是否小于0

例如:
時(shí)間數(shù)組 time 為 [0, 1, 2], 那么我們

  • 第0分鐘消滅到達(dá)時(shí)間為0的怪獸
  • 第1分鐘消滅到達(dá)時(shí)間為1的怪獸
  • 第2分鐘消滅到達(dá)時(shí)間為2的怪獸
    故滿足

dist[i]: [1, 1, 3], speed[1, 1, 1]
時(shí)間數(shù)組 time 為 [0, 0, 2], 那么我們

  • 第0分鐘消滅到達(dá)時(shí)間為0的怪獸

但是在1分鐘實(shí)際上有2只到達(dá), 我們同一時(shí)間點(diǎn)只能消滅1只, 故不滿足

代碼

未翻譯版
    func eliminateMaximum(_ dist: [Int], _ speed: [Int]) -> Int {

        var res = 0, time = Array(repeating: 0, count: dist.count)
        
        for i in 0..<dist.count {
            
            time[i] = (dist[i] - 1) / speed[i]
        }
        
        time.sort()
        
        for i in 0..<time.count {
            
            if time[i] - i < 0 {
                break;
            }
            
            res += 1
        }
        
        return res;
    }
翻譯版
    func eliminateMaximum(_ dist: [Int], _ speed: [Int]) -> Int {

        // 定義結(jié)果res, 空數(shù)組time, 用來(lái)存放最小消滅時(shí)間
        var res = 0, time = Array(repeating: 0, count: dist.count)
        
        // 遍歷, 存放最小消滅時(shí)間的空數(shù)組
        for i in 0..<dist.count {
            
            // 空數(shù)組依次插入最小消滅時(shí)間
            time[i] = (dist[i] - 1) / speed[i]
        }
        
        // 時(shí)間數(shù)組正序排列
        time.sort()
        
        // 遍歷時(shí)間數(shù)組
        for i in 0..<time.count {
            
            // 如果 當(dāng)前時(shí)間小于
            if time[i] - i < 0 {
                break;
            }
 
            // 滿足 消滅結(jié)果 + 1           
            res += 1
        }
        
        // 返回 最大消滅數(shù)量res
        return res;
    }

題目來(lái)源:力扣(LeetCode) 感謝力扣爸爸 :)
IOS 算法合集地址

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容