从零开始学习c++,每天起码做一道leetcode题目,在此记录,希望最后能够有所收获!
一、题目描述
给你一个下标从 0 开始、长度为 n 的数组 nums 。一开始,所有元素都是 未染色 (值为 0 )的。
给你一个二维整数数组 queries ,其中 queries[i] = [indexi, colori] 。
对于每个操作,你需要将数组 nums 中下标为 indexi 的格子染色为 colori 。
请你返回一个长度与 queries 相等的数组 answer ,其中 answer[i]是前 i 个操作 之后 ,相邻元素颜色相同的数目。
更正式的,answer[i] 是执行完前 i 个操作后,0 <= j < n - 1 的下标 j 中,满足 nums[j] == nums[j + 1] 且 nums[j] != 0 的数目。
示例 1:
输入:n = 4, queries = [[0,2],[1,2],[3,1],[1,1],[2,1]]
输出:[0,1,1,0,2]
解释:一开始数组 nums = [0,0,0,0] ,0 表示数组中还没染色的元素。
- 第 1 个操作后,nums = [2,0,0,0] 。相邻元素颜色相同的数目为 0 。
- 第 2 个操作后,nums = [2,2,0,0] 。相邻元素颜色相同的数目为 1 。
- 第 3 个操作后,nums = [2,2,0,1] 。相邻元素颜色相同的数目为 1 。
- 第 4 个操作后,nums = [2,1,0,1] 。相邻元素颜色相同的数目为 0 。
- 第 5 个操作后,nums = [2,1,1,1] 。相邻元素颜色相同的数目为 2 。
示例 2:
输入:n = 1, queries = [[0,100000]]
输出:[0]
解释:一开始数组 nums = [0] ,0 表示数组中还没染色的元素。
- 第 1 个操作后,nums = [100000] 。相邻元素颜色相同的数目为 0 。
提示:
- 1 <= n <=
- 1 <= queries.length <=
- queries[i].length == 2
- 0 <= indexi <= n - 1
- 1 <= colori <=
二、思路分析
写出来了,不过花费的时间比较长,而且行数很多,但最后效果其实和下面的简洁的代码差不多。
主要就是每一次更改,都需要判断与该次更改的位置的值与两边的值是否相等,使用一个数来记录有多少相同的元素,最后遍历一次后就把count添加进去就行。
思路不是很难,主要看怎么快速实现。
三、AC代码
class FrequencyTracker {
unordered_map<int, int> cnt; // 每个数的出现次数
unordered_map<int, int> freq; // 出现次数的出现次数
public:
FrequencyTracker() {
}
void add(int number) {
--freq[cnt[number]];
cnt[number]++;
freq[cnt[number]]++;
}
void deleteOne(int number) {
if(cnt[number]){
--freq[cnt[number]];
cnt[number]--;
freq[cnt[number]]++;
}
}
bool hasFrequency(int frequency) {
return freq[frequency];
}
};
四、总结
难度不是很大,主要是怎么简洁地写出来