遊戲模擬題 消滅最大數量的怪獸 Eliminate Max Num of Monsters_Leetcode#1921

更新 發佈閱讀 6 分鐘
raw-image

這題的題目在這裡:

題目敘述

這題的場景是防禦城市,免於怪獸的入侵

題目會給定兩個陣列:

一個是dist,代表怪獸和城市之間的距離

一個是speed,代表怪獸每分鐘前進的距離,也就是怪獸的速度

我們有一把一開始已經充滿電的電動槍,一槍可以擊殺一隻怪獸,擊發後需要耗費一分鐘的冷卻時間讓電動槍再次充滿電。


當怪獸抵達城市的時候,我們就算輸了。


題目要求我們計算最多可以消滅幾隻怪獸


測試範例

Example 1:

Input: dist = [1,3,4], speed = [1,1,1]
Output: 3
Explanation:
In the beginning, the distances of the monsters are [1,3,4]. You eliminate the first monster.
After a minute, the distances of the monsters are [X,2,3]. You eliminate the second monster.
After a minute, the distances of the monsters are [X,X,2]. You eliminate the thrid monster.
All 3 monsters can be eliminated.

Example 2:

Input: dist = [1,1,2,3], speed = [1,1,1,1]
Output: 1
Explanation:
In the beginning, the distances of the monsters are [1,1,2,3]. You eliminate the first monster.
After a minute, the distances of the monsters are [X,0,1,2], so you lose.
You can only eliminate 1 monster.

Example 3:

Input: dist = [3,2,4], speed = [5,3,2]
Output: 1
Explanation:
In the beginning, the distances of the monsters are [3,2,4]. You eliminate the first monster.
After a minute, the distances of the monsters are [X,0,2], so you lose.
You can only eliminate 1 monster.

約束條件

Constraints:

  • n == dist.length == speed.length
  • 1 <= n <= 10^5
  • 1 <= dist[i], speed[i] <= 10^5

演算法

題目已經給我們怪獸的距離,和怪獸的速度。我們可以接著計算出怪獸抵達城市的秒數。

然後,把計算出來的秒數,也就是怪獸抵達城市的先後次序由小到大排序好。

這一步驟用到了排序的觀念。


下一步,為了最大化怪獸擊殺數量,也就是最大化我方存活時間,就是依照怪獸威脅的輕重緩急,也就是怪獸抵達城市的先後次序,我們就按照這個順序去消滅怪獸。

這一步驟用到了Greedy 貪心的觀念,局部最優解導出全局最優解


最後,當遊戲結束(怪獸已經抵達城市,或者我方率先消滅所有怪獸)時,當下的擊殺數量就是怪獸擊殺數量的最大值


程式碼

class Solution:
 def eliminateMaximum(self, dist: List[int], speed: List[int]) -> int:
  
  n = len(dist)

  # Time of arrival = distance / speed
  time_of_arrival = [ d/s for d, s in zip(dist, speed) ]

  # Keep time of arrival sorted in ascending order
  # And we will shoot monster with this order
  time_of_arrival.sort()

  # Simulate the shooting process
  for i_th_monster in range(n):

   # one shot per minute
   shooting_time = i_th_monster
   
   if time_of_arrival[i_th_monster] <= shooting_time:
    # oops, monster already get into city.
    return i_th_monster

  # It's safe now, We can emiminate all monsters!
  # : )
  return n

複雜度分析

時間複雜度:

O( n log n ) 耗費在怪獸秒數(也是怪獸抵達城市的先後次序)的排序上。

空間複雜度:

O(n) time_of_arrival陣列,儲存怪獸抵達城市的秒數,也是抵達城市的先後順序。


關鍵知識點

為了最大化怪獸擊殺數量,也就是最大化我方存活時間,就是依照怪獸威脅的輕重緩急,也就是怪獸抵達城市的先後次序,我們就按照這個順序去消滅怪獸。

這一步驟用到了Greedy 貪心的觀念,局部最優解導出全局最優解


最後,當遊戲結束(怪獸已經抵達城市,或者我方率先消滅所有怪獸)時,當下的擊殺數量就是怪獸擊殺數量的最大值


Reference:

[1] Eliminate Maximum Number of Monsters - LeetCode

留言
avatar-img
留言分享你的想法!
avatar-img
小松鼠的演算法樂園
96會員
427內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
2024/10/06
題目敘述 Rank Transform of an Array 給定一個陣列arr,請根據數字的大小給予序號,序號值介於1~len( set(arr) )之間。 最大的數字給予最大的序號。 次大的數字給予次大的序號。 ...依此類推 最小的數字給予最小的序號1。
Thumbnail
2024/10/06
題目敘述 Rank Transform of an Array 給定一個陣列arr,請根據數字的大小給予序號,序號值介於1~len( set(arr) )之間。 最大的數字給予最大的序號。 次大的數字給予次大的序號。 ...依此類推 最小的數字給予最小的序號1。
Thumbnail
2024/10/01
題目敘述 Check If Array Pairs Are Divisible by k 給定一個長度為偶數的整數陣列arr,和一個整數k 。 我們想把陣列元素兩兩一組組成pair,使得每個pair的總和可以被k整除。 如果做得到,返回True。 如果不行,返回False。
Thumbnail
2024/10/01
題目敘述 Check If Array Pairs Are Divisible by k 給定一個長度為偶數的整數陣列arr,和一個整數k 。 我們想把陣列元素兩兩一組組成pair,使得每個pair的總和可以被k整除。 如果做得到,返回True。 如果不行,返回False。
Thumbnail
2024/09/29
My Calendar II 給定一個行事曆的class定義和行程安排的介面。 請完成下列function 1.建構子MyCalendarTwo() 2.boolean book(int start, int end) 在行事曆加入一項新行程,起始時間為start, 結束時間為end。
Thumbnail
2024/09/29
My Calendar II 給定一個行事曆的class定義和行程安排的介面。 請完成下列function 1.建構子MyCalendarTwo() 2.boolean book(int start, int end) 在行事曆加入一項新行程,起始時間為start, 結束時間為end。
Thumbnail
看更多
你可能也想看
Thumbnail
題目敘述 Solving Questions With Brainpower 給定一個測驗題陣列,每個欄位都是一個pair, 分別記錄測驗題做完可以得到的分數,和需要的冷卻時間 (也就是會有一段時間不能作答接下來的題目)。 請問在最佳的答題策略下,最多可以獲得多少分數?
Thumbnail
題目敘述 Solving Questions With Brainpower 給定一個測驗題陣列,每個欄位都是一個pair, 分別記錄測驗題做完可以得到的分數,和需要的冷卻時間 (也就是會有一段時間不能作答接下來的題目)。 請問在最佳的答題策略下,最多可以獲得多少分數?
Thumbnail
題目敘述 題目會給我們一個輸入陣列nums,每個元素值代表那個格子點可以跳躍的最大長度。 題目保證始從最左邊的格子點出發開始跳,一定可以成功抵達終點,請問最少跳躍次數是說少? 題目的原文敘述 測試範例 Example 1: Input: nums = [2,3,1,1,4] Outp
Thumbnail
題目敘述 題目會給我們一個輸入陣列nums,每個元素值代表那個格子點可以跳躍的最大長度。 題目保證始從最左邊的格子點出發開始跳,一定可以成功抵達終點,請問最少跳躍次數是說少? 題目的原文敘述 測試範例 Example 1: Input: nums = [2,3,1,1,4] Outp
Thumbnail
題目敘述 題目會給定一個指定高度和寬的方格版,還有一顆小球的起始位置,和最大移動步數。 小球每一步可以選擇向上、下、左、右移動一格,請問小球能走到方格版界外的路徑方法數總共有幾種? 方法數可能很大,題目要求,最後回傳答案時,先對10^9+7做除法取餘數再回傳。 題目的原文敘述 約束條件
Thumbnail
題目敘述 題目會給定一個指定高度和寬的方格版,還有一顆小球的起始位置,和最大移動步數。 小球每一步可以選擇向上、下、左、右移動一格,請問小球能走到方格版界外的路徑方法數總共有幾種? 方法數可能很大,題目要求,最後回傳答案時,先對10^9+7做除法取餘數再回傳。 題目的原文敘述 約束條件
Thumbnail
題目敘述 題目會給我們一個陣列,要求我們返回 兩數之和=target所在的陣列索引值。 題目還額外保證,一定剛好有一組解。 測試範例 Example 1: Input: nums = [2,7,11,15], target = 9 Output: [0,1]
Thumbnail
題目敘述 題目會給我們一個陣列,要求我們返回 兩數之和=target所在的陣列索引值。 題目還額外保證,一定剛好有一組解。 測試範例 Example 1: Input: nums = [2,7,11,15], target = 9 Output: [0,1]
Thumbnail
場景是防禦城市,免於怪獸的入侵 題目會給定兩個陣列 一個是dist,代表怪獸和城市之間的距離 一個是speed,代表怪獸每分鐘前進的距離,也就是怪獸的速度 有一把一開始已經充滿電的電動槍,一槍可以擊殺一隻怪獸,擊發後需要耗費一分鐘的冷卻時間讓電動槍再次充滿電。 題目要求我們計算最多可以消滅幾隻怪獸?
Thumbnail
場景是防禦城市,免於怪獸的入侵 題目會給定兩個陣列 一個是dist,代表怪獸和城市之間的距離 一個是speed,代表怪獸每分鐘前進的距離,也就是怪獸的速度 有一把一開始已經充滿電的電動槍,一槍可以擊殺一隻怪獸,擊發後需要耗費一分鐘的冷卻時間讓電動槍再次充滿電。 題目要求我們計算最多可以消滅幾隻怪獸?
Thumbnail
題目到底要我們做什麼?閱讀素養有多重要,試試這題就知道!
Thumbnail
題目到底要我們做什麼?閱讀素養有多重要,試試這題就知道!
Thumbnail
題目會給我們兩個陣列left, right 分別代表每隻螞蟻所在的初始位置 和 方向,n代表木板長度。每隻螞蟻每秒鐘前進一單位長度。 問我們,每隻螞蟻從初始位置出發,0秒起算,當兩隻螞蟻相遇時,會互相掉頭,往相反方向前進,問最後一隻螞蟻掉落木板的時候是幾秒鐘?
Thumbnail
題目會給我們兩個陣列left, right 分別代表每隻螞蟻所在的初始位置 和 方向,n代表木板長度。每隻螞蟻每秒鐘前進一單位長度。 問我們,每隻螞蟻從初始位置出發,0秒起算,當兩隻螞蟻相遇時,會互相掉頭,往相反方向前進,問最後一隻螞蟻掉落木板的時候是幾秒鐘?
Thumbnail
題目會給定我們一個陣列,要求我們重新安排順序,把等於零的數字搬到後面。 同時必須保持原本數字的前後相對次序。
Thumbnail
題目會給定我們一個陣列,要求我們重新安排順序,把等於零的數字搬到後面。 同時必須保持原本數字的前後相對次序。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News