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;
        }
    };
    
    别废话,拿你代码给我看。
  • 相关阅读:
    font-weight(字体粗细)属性
    Node.js入门(三)
    js难点问题
    Node.js入门(二)
    Node.js入门(一)
    Reactjs的Controller View模式
    智能社的邀请码
    react native 学习资料汇总
    jquery操作select
    分享
  • 原文地址:https://www.cnblogs.com/lvxueyang/p/13707387.html
Copyright © 2011-2022 走看看