题目链接:
题目意思:
给一个数组,寻找其中两个数的和可以整除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++的学习