1010. 总持续时间可被 60 整除的歌曲『简单』

题目来源于力扣(LeetCode

一、题目

1010. 总持续时间可被 60 整除的歌曲

题目相关标签:数组

提示:

  • 1 <= time.length <= 60000
  • 1 <= time[i] <= 500

二、解题思路

  1. 据题意:我们希望索引的数字 ij 满足 **i < j **且有 (time[i] + time[j]) % 60 == 0

  2. 创建一个 60 个长度的数组,用于存储 time 数组中的元素对 60 的取余

    为什么要取余?

    time[i] 的数值可能大于 60,则需要将数组全部转换成 60 及其以下的数值以便计算

  3. 因索引 i 需要小于索引 j,即元素不能与自身相加来等于 60 的倍数

  4. 遍历 time 数组,将数组元素对 60 进行取余,将 60 与取余结果相减,可得到当前遍历元素需要相加的数值才能成为 60 的倍数

  5. 最后需要将当前遍历元素对 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);
}
posted @ 2020-05-14 21:10  知音12138  阅读(113)  评论(0编辑  收藏  举报