【Leetcode】python - [2244] Minimum Rounds to Complete All Tasks 個人解法筆記 | 289th LeetCode Weekly Contest

題目出處

2244. Minimum Rounds to Complete All Tasks

難度

medium

個人範例程式碼

class Solution:
    def minimumRounds(self, tasks: List[int]) -> int:
        # 1: -1 round
        # 2: 1 round
        # 3: 2 rounds
        # 3k: k rounds
        # 3k+1: 4=3(k-1)+2+2, k+1 times
        # 3k+2: 5=3(1)+2, k+1 times
        counters = Counter(tasks)
        ans = 0
        for num_of_task in counters.values():
            if num_of_task <= 1:
                return -1
            else:
                # 3 = 1 
                # 4 = 2
                # 5 = 2
                # 6 = 2
                ans += (num_of_task+2)//3
        return ans

算法說明

這題考的是數學歸納法的概念,比較是數學的範圍

我們推論:

  • 1: -1 round
  • 2: 1 round
  • 3: 2 rounds
  • 3k: k rounds
  • 3k+1: 4=3(k-1)+2+2, k+1 times
  • 3k+2: 5=3(1)+2, k+1 times

而為了計算方便,我們可以做一些使計算上方便的技巧。

  • 3 = 1
  • 4 = 2
  • 5 = 2
  • 6 = 2

我們透過移動 k+2 使得 // 3 後能夠直接得到我們要的數字。

最近在練習程式碼本身就可以自解釋的 Coding style,可以嘗試直接閱讀程式碼理解

input handling

x

Boundary conditions

只要發現其中一個任務不可能執行完成,提早 return -1。

Reference