周賽 402。two sum 的變形題。

題目

輸入整數陣列 hours,代表以小時為單位的時間。
回傳一個整數,代表滿足 i < j 且 hours[i] + hours[j] 可構成整天的數對數目。

整天指的是 24 小時的整數倍數。
例如一天 24 小時、兩天 48小時、三天 72小時,以此類推。

解法

我們要找兩個數 x, y 滿足 x + y 是 24 的倍數。

假設 x + y = 24,則 (x + 24) + y 或 (x + 48) + y 肯定也是 24 的倍數。
滿 24 的部分不影響答案,先對 x 對 24 求餘數,之後求 y = 24 - x,找先前出現過幾個 y。

注意:若 x 本身就是 24 的倍數,則餘數會是 0,使得 y = 24 - 0 = 24。所以得對 y 再取一次餘數才不會越界。

時間複雜度 O(N)。
空間複雜度 O(1)。

class Solution:
    def countCompleteDayPairs(self, hours: List[int]) -> int:
        cnt = [0] * 24
        ans = 0
        for x in hours:
            y = (24 - x) % 24
            ans += cnt[y]
            cnt[x % 24] += 1
            
        return ans