【LeetCode】第 344 场周赛题解

41 阅读1分钟

6416. 找出不同元素数目差数组

题解:前后缀和

class Solution {
public:
    vector<int> distinctDifferenceArray(vector<int>& nums) {
        set<int> s;
        int n = nums.size();
        vector<int> f(n+1), g(n+1);
        for(int i=0; i<n; i++){
            s.insert(nums[i]);
            f[i] = s.size();
        }
        s.clear();
        for(int i=n-1; i>=0; i--){
            s.insert(nums[i]);
            g[i] = s.size();
        }
        
        vector<int> res;
        for(int i=0; i<n; i++){
           res.push_back(f[i] - g[i+1]);
        }
        return res;
    }
};

6417. 频率跟踪器

题解:哈希表

class FrequencyTracker {
public:
    unordered_map<int ,int> hash;
    unordered_map<int, unordered_set<int>> feq;
    FrequencyTracker() {

    }
    
    void add(int number) {
           feq[hash[number]].erase(number);
           hash[number]++;
           feq[hash[number]].insert(number);
    }
    
    void deleteOne(int number) {
        if(hash.count(number)){
            feq[hash[number]].erase(number);
            int cnt = hash[number];
            if(cnt > 1){
                cnt--;
                feq[cnt].insert(number);
                hash[number] = cnt;
            }else{
                hash.erase(number);
            }
        }
    }
    
    bool hasFrequency(int frequency) {
        return feq[frequency].size();
    }
};

/**
 * Your FrequencyTracker object will be instantiated and called as such:
 * FrequencyTracker* obj = new FrequencyTracker();
 * obj->add(number);
 * obj->deleteOne(number);
 * bool param_3 = obj->hasFrequency(frequency);
 */

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

题解:模拟

class Solution {
public:
    vector<int> colorTheArray(int n, vector<vector<int>>& queries) {
        vector<int> res;
        int color[n];
        memset(color, 0, sizeof color);
        int cur = 0;
        for(auto q : queries){
            int idx = q[0];
            if(idx-1 >= 0 && color[idx-1] == color[idx] && color[idx] != 0) cur--;
            if(idx+1 < n && color[idx+1] == color[idx] && color[idx] != 0) cur--;
            color[idx] = q[1];
            if(idx-1 >=0 && color[idx-1] == color[idx] && color[idx] != 0) cur++;
            if(idx+1 < n && color[idx+1] == color[idx] && color[idx] != 0) cur++;
            res.push_back(cur);
        }
        return res;
    }
};

6419. 使二叉树所有路径值相等的最小代价

题解: DFS

class Solution {
public:
    vector<int> c;
    int res;
    int dfs(int x, int n){
        if(x > n) return 0;
        int l = dfs(x*2, n);
        int r = dfs(x*2+1, n);
        res += abs(l - r);
        return max(l, r) + c[x-1];
    }
    int minIncrements(int n, vector<int>& cost) {
        c = cost;
        dfs(1, n);
        return res;
    }
};