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

标题LeetCode-1010.总持续时间可被60整除的歌曲

    这道题一看感觉就很简单,一看也感觉会出现超时错误,不过题目中没有提示要注意时间复杂度,我就直接暴力破解了,果然超时了。下面是超时的代码版本

class Solution {
public:
    int numPairsDivisibleBy60(vector<int>& time) {
        int ans=0;
        for(int i=0; i<time.size(); i++){
            for(int j=i+1; j<time.size(); j++){
                if((time[i]+time[j])%60==0)
                    ans++;
            }
        }
        return ans;
    }
};

    超时之后我就开始想新的方案,感觉可以用哈希表,我看了一下题目的标签,果然可以用哈希表,但是仔细一想又不知道怎么实现。后来我注意到下标之间的大小关系,意识到可以从后往前遍历,并对当前遍历数进行取余操作,并统计余数出现的次数,之后直接去找补数的出现次数,然后把这个数量加在结果上就好。编码过程中出现了一些问题,后来调整了,但是还是出现错误。

class Solution {
public:
    int numPairsDivisibleBy60(vector<int>& time) {
        int ans=0, n=time.size();
        vector<int> _time(61, 0);
        _time[60]=1;
        for(int i=n-1; i>=0; i--){
            time[i] = time[i] % 60;
            ans+=_time[60-time[i]];
            _time[time[i]]++;
        }
        return ans;
    }
};

  看完题解之后才发现,我的关注点错了。下标其实并不重要。我所谓的从后遍历也并不重要,至少在这道题目中不重要,有些题目确实从后遍历更简单。这道题的关键是两个不同的数字(在数组中的索引不同)满足一定的条件(和是60的倍数),所以关键是两个不同的数字,我最开始想用哈希表的时候太过关注索引的大小问题,导致我试图在哈希表中存储数字的下标,虽然之后我修改了这一代码,但这个思维误区导致我最终编码失败。
  它的题目标签中有计数这一标签,但是被我忽略了,这是我代码错误的点。我错误的点是没有分清边界情况,我在测试阶段发现了一个错误点即能够被60整除的数字,我做了一些处理,但是依然没有处理好。初次之外,余数为30的数字也是一个特殊情况,这一点我根本没有考虑到,更谈不上去处理。
  余数是0的数字必须和另外一个余数是0的数字组合在一起,才能使结果加1;余数是30的数字同样的套路;这是一个组合问题,即 C n 2 C_n^2 Cn2,n是余数是0或30的数字的数量。
  余数是1-29和31-59的数字则可以互相成对匹配,我的遍历思路和题解思路不一致,题解中是乘,我是每次都加,应该是没有差别的。
  另外一个被忽略的点是类型溢出问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值