G
N
I
D
A
O
L

在歌曲列表中,第 i 首歌曲的持续时间为 time[i] 秒。

返回其总持续时间(以秒为单位)可被 60 整除的歌曲对的数量。形式上,我们希望下标数字 ij 满足 i < j 且有  (time[i] + time[j]) % 60 == 0

题目链接:https://leetcode.cn/problems/pairs-of-songs-with-total-durations-divisible-by-60/

# 解题思路

  1. 使用 hash 计数表记录每个数出现的次数
  2. 从小到大枚举每个 i ,则 j = 60 * n - (60 - i % 60) ,接着枚举 n 即可;需要注意的是,为了避免重复计算,只需记录 j>=i 时满足条件的数对。
  • j == i ,则 : ans += cntMap[i] * (cntMap[i] - 1) / 2
  • j > i ,则: ans += cntMap[i] * cntMap[j]

注意 int 溢出问题

# 提交结果

image.png

# 代码

class Solution {
    public int numPairsDivisibleBy60(int[] time) {
        final int M = 500; 
        int[] cntMap = new int[M + 1];
        for (int t : time) ++cntMap[t];
        
        long ans = 0;
        for (int i = 1; i <= M; ++i) {
            if (cntMap[i] < 1) continue;
            for (int j = 60 - (i % 60); j <= M; j += 60) {
                if (j < i || cntMap[j] < 1) continue;
                else if (j == i) ans += (long) cntMap[i] * (cntMap[i] - 1) / 2;
                else ans += (long) cntMap[i] * cntMap[j];
            }
        }
        return (int) ans;
    }
}
更新于 阅读次数

😉觉得写的还不错,请我喝杯咖啡吧😁

独步凌波 微信支付

微信支付

独步凌波 支付宝

支付宝