zoukankan      html  css  js  c++  java
  • 力扣-1010. 总持续时间可被 60 整除的歌曲

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

    输入:[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
    

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

    class Solution {
    public:
        int numPairsDivisibleBy60(vector<int>& time) {
            int count[60],res = 0;
            if(time.empty()){
                return 0;
            }
            memset(count,0,sizeof(count));
            for(int i = 0;i < time.size();i++){
                time[i] %= 60;
                count[time[i]]++;
            }
            sort(time.begin(),time.end());
            for(int i = 0;i < time.size();i++){
                if(time[i] >= 30){
                    break;
                }
                if(time[i] == 0){
                    continue;
                }
                res += count[60 - time[i]];
            }
            res += (count[0] * (count[0] - 1)) / 2;
            res += (count[30] * (count[30] - 1)) / 2;
            return res;
        }
    };
    
    别废话,拿你代码给我看。
  • 相关阅读:
    Bit Manipulation
    218. The Skyline Problem
    Template : Two Pointers & Hash -> String process
    239. Sliding Window Maximum
    159. Longest Substring with At Most Two Distinct Characters
    3. Longest Substring Without Repeating Characters
    137. Single Number II
    142. Linked List Cycle II
    41. First Missing Positive
    260. Single Number III
  • 原文地址:https://www.cnblogs.com/lvxueyang/p/13707387.html
Copyright © 2011-2022 走看看