Algorithm
lc1010_总持续时间可被60整除的歌曲
思路:
看了一下提示,是通过所有的数对60取模后计数,然后配对能凑成60的数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
class Solution {
public:
int numPairsDivisibleBy60(vector<int>& time) {
unordered_map<int, int> cnt;
for (auto x : time) {
cnt[x%60]++;
}
int ans = 0;
for (int i=0; i <= 30; i++) {
if (!cnt[i]) {
continue;
}
// cout << "i = " << i << " cnt[i] = " << cnt[i] << endl;
if (i == 0 || i == 30) {
// 36*1e8 已经超过 21*1e8 爆int了... 不是42*1e8才爆,所以先除以2 , WA一发
if (cnt[i] & 1) {
ans += (cnt[i] - 1) / 2 * cnt[i];
} else {
ans += cnt[i] / 2 * (cnt[i] - 1);
}
// 这里要注意continue...或者下面else...上面搞的没else又wa一发
continue;
}
// 3*1e4 * 3*1e4 = 9 * 1e8,这种不会爆
ans += cnt[i] * cnt[60 - i];
// cout << "ans = " << ans << " cnt[60 - i] = " << cnt[60 - i] << endl;
}
return ans;
}
};
|
答案更精简一些:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
class Solution {
public:
int numPairsDivisibleBy60(vector<int>& time) {
vector<int> cnt(60);
for (int t : time) {
cnt[t % 60]++;
}
long long res = 0;
for (int i = 1; i < 30; i++) {
res += cnt[i] * cnt[60 - i];
}
res += (long long)cnt[0] * (cnt[0] - 1) / 2 + (long long)cnt[30] * (cnt[30] - 1) / 2;
return (int)res;
}
};
|
Review
【TED演讲】开源学习革命的诞生
开源学习的诞生:
- 开源为了更好地共同创作,更好地共同修改,更好地传播知识
- 从而更好地一起创造更好的世界
Tips
一文带你看透基于LSM-tree的NoSQL系统优化方向
Share
人生其实是运气占主导,所以快乐生活,为而不争
https://youtu.be/qzIfQ5_gYzc
老高介绍了人生运气实验,发现人生的财富大小其实和能力的大小相关性基本没有太多相关性,更多的是运气占人生主导。
能力只是抓住机会使得财富翻倍的概率。所以能力中等偏上就已经很不错了,剩下的全靠运气。
所以把能力提升到中等偏上的后,多多去开阔视野,去发现好运,这样才是最大可能的获得更多财富。
而且了解到运气才是人生的主导,也能让我们感到释然,做好当下的事情,并也及时行乐,尽人事,听天命,这样才能与自己和解,成为一个内心平和的人。