题目来源于力扣(LeetCode)
一、题目
题目相关标签:数组
提示:
1 <= time.length <= 60000
1 <= time[i] <= 500
二、解题思路
-
据题意:我们希望索引的数字
i
和j
满足 **i < j
**且有(time[i] + time[j]) % 60 == 0
。 -
创建一个 60 个长度的数组,用于存储 time 数组中的元素对 60 的取余
为什么要取余?
time[i] 的数值可能大于 60,则需要将数组全部转换成 60 及其以下的数值以便计算
-
因索引 i 需要小于索引 j,即元素不能与自身相加来等于 60 的倍数
-
遍历 time 数组,将数组元素对 60 进行取余,将 60 与取余结果相减,可得到当前遍历元素需要相加的数值才能成为 60 的倍数
-
最后需要将当前遍历元素对 60 取余的结果存储到 arr 数组中,作为后续数组元素的相加值
三、代码实现
public static int numPairsDivisibleBy60(int[] time) {
int count = 0;
// 0 ~ 59
int[] arr = new int[60];
for (int i : time) {
// 当前遍历元素取余 60,再用 60 减去取余的结果
int j = 60 - (i % 60);
// j = 60 - (60 % 60) 的情况,i 可能为 360 数值的情况
count += arr[j % 60];
// 当前遍历元素对 60 取余的结果存储到数组中,且数组元素加 1
arr[i % 60] ++;
}
return count;
}
四、执行用时
五、部分测试用例
public static void main(String[] args) {
int[] time = {30, 20, 150, 100, 40}; // output:3
// 注意,这里的输出为 3,是因为第一项 60 与第二项 60,与第三项 60 的和为 60 的倍数
// 第二项 60 与第三项 60 的和为 60 的倍数,12,13,23 组成的三对,所以结果为 3
// int[] time = {60, 60, 60}; // output:3
int result = numPairsDivisibleBy60(time);
System.out.println(result);
}