LeetCode 6418.有相同颜色的相邻元素数目

154 阅读1分钟

从零开始学习c++,每天起码做一道leetcode题目,在此记录,希望最后能够有所收获!

一、题目描述

6418.有相同颜色的相邻元素数目

给你一个下标从 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 <= 10510^5
  • 1 <= queries.length <= 10510^5
  • queries[i].length == 2
  • 0 <= indexi <= n - 1
  • 1 <=  colori <= 10510^5

二、思路分析

写出来了,不过花费的时间比较长,而且行数很多,但最后效果其实和下面的简洁的代码差不多。

主要就是每一次更改,都需要判断与该次更改的位置的值与两边的值是否相等,使用一个数来记录有多少相同的元素,最后遍历一次后就把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];
    }
};

四、总结

难度不是很大,主要是怎么简洁地写出来