leetcode 1023

博客围绕LeetCode题目展开,题目要求在数组中找出两数和能整除60的对数。给出样例及解释后,介绍了解题思路,包括暴力法(会超时)、取余后用哈希表法,还可利用60长度数组存储取余结果。最后博主反思自身,要加强C++学习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:

https://leetcode-cn.com/contest/weekly-contest-128/problems/pairs-of-songs-with-total-durations-divisible-by-60/

题目意思:

给一个数组,寻找其中两个数的和可以整除60的个数.

样例:

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

思路:

1.暴力
直接两个循环,两个数相加,再判断能不能整除60.
结果,果不其然会超时间.....
2.如果先将每个数对60取余,那个每个数就是小于60的数了,这样就变成了判断两个数的和等于一个目标值的题目了,然后就可以参考 https://leetcode-cn.com/problems/two-sum/的做法了.采用哈希表.

class Solution {
public:
    int numPairsDivisibleBy60(vector<int>& time) {
        int num = 0;
        int n = time.size();
        map<int, int> m;
        for(int i = 0; i < n; i++)
        {  
            time[i] = time[i] % 60;
            if(m.find(time[i]) == m.end())  m[time[i]] = 1;
            else m[time[i]] ++;
        }

        for(auto &i : m)
        {
            if(m.find(60 - i.first) != m.end())
            {
              //30和0,比较特殊
                 if(m.find(60 - i.first)->first != 30)
                 {
                     num += m.find(60 - i.first)->second * i.second;
                     i.second = 0;
                 }                 
            }
        }
        num += (m.find(0)->second - 1) * m.find(0)->second / 2 + (m.find(30)->second - 1) * m.find(30)->second / 2;
        return num ;
    }
};

3.可以继续上面的思路,由于取余之后的范围是0~60,所以可以用一个60长度的数组存下来,之后就简单了.(参考大佬的代码)

class Solution {
public:
    int numPairsDivisibleBy60(vector<int>& time) {
	int n = time.size();
  	vector<int> cnt(60);
  	int ans = 0;
  	for (int i = 0; i < n; ++i) {
  		int t = time[i] % 60;
  		ans += cnt[(60 - t) % 60];
  		++cnt[time[i] % 60];
		}
		return ans;
    }
};
小结:

1.还是太笨了,简单题都纠结半天.......
2.c++的STL用的不熟练,需要加强c++的学习

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值