加载中...
1010-总持续时间可被 60 整除的歌曲(Pairs of Songs With Total Durations Divisible by 60)
发表于:2021-12-03 | 分类: 中等
字数统计: 769 | 阅读时长: 3分钟 | 阅读量:

原文链接: https://leetcode-cn.com/problems/pairs-of-songs-with-total-durations-divisible-by-60

英文原文

You are given a list of songs where the ith song has a duration of time[i] seconds.

Return the number of pairs of songs for which their total duration in seconds is divisible by 60. Formally, we want the number of indices i, j such that i < j with (time[i] + time[j]) % 60 == 0.

 

Example 1:

Input: time = [30,20,150,100,40]
Output: 3
Explanation: Three pairs have a total duration divisible by 60:
(time[0] = 30, time[2] = 150): total duration 180
(time[1] = 20, time[3] = 100): total duration 120
(time[1] = 20, time[4] = 40): total duration 60

Example 2:

Input: time = [60,60,60]
Output: 3
Explanation: All three pairs have a total duration of 120, which is divisible by 60.

 

Constraints:

  • 1 <= time.length <= 6 * 104
  • 1 <= time[i] <= 500

中文题目

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

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

 

示例 1:

输入:time = [30,20,150,100,40]
输出:3
解释:这三对的总持续时间可被 60 整除:
(time[0] = 30, time[2] = 150): 总持续时间 180
(time[1] = 20, time[3] = 100): 总持续时间 120
(time[1] = 20, time[4] = 40): 总持续时间 60

示例 2:

输入:time = [60,60,60]
输出:3
解释:所有三对的总持续时间都是 120,可以被 60 整除。

 

提示:

  • 1 <= time.length <= 6 * 104
  • 1 <= time[i] <= 500

通过代码

高赞题解

思路

  1. 整数对60取模,可能有60种余数。故初始化一个长度为60的数组,统计各余数出现的次数。
  2. 遍历time数组,每个值对60取模,并统计每个余数值(0-59)出现的个数。因为余数部分需要找到合适的cp组合起来能被60整除。
  3. 余数为0的情况,只能同余数为0的情况组合(如60s、120s等等)。0的情况出现k次,则只能在k中任选两次进行两两组合。本题解单独写了个求组合数的方法,也可以用k * (k - 1) / 2表示。
  4. 余数为30的情况同上。
  5. 其余1与59组合,2与58组合,故使用双指针分别从1和59两头向中间遍历。1的情况出现m次,59的情况出现n次,则总共有m*n种组合。

题解

public int numPairsDivisibleBy60(int[] time) {
	int count = 0;
	int[] seconds = new int[60];
	for(int t : time) {
		seconds[t % 60] += 1; 
	}
	count += combination(seconds[30], 2);
	count += combination(seconds[0], 2);
	int i = 1, j = 59;
	while(i < j) {
		count += seconds[i++] * seconds[j--];
	}
	return count;
}

// 求组合数
public int combination(int n, int k) {
	long result = 1;
	for(int i = 1; i <= k; i++) {
		result = result * (n - i + 1) / i;
	}
	return (int)result;
}

时间和空间复杂度

时间复杂度:O(n)
空间复杂度:O(1) 固定空间开销(长度为60的数组)

统计信息

通过次数 提交次数 AC比率
19032 41795 45.5%

提交历史

提交时间 提交结果 执行时间 内存消耗 语言
上一篇:
1009-十进制整数的反码(Complement of Base 10 Integer)
下一篇:
1011-在 D 天内送达包裹的能力(Capacity To Ship Packages Within D Days)
本文目录
本文目录