LeetCode每日一题 | 2670. 找出不同元素数目差数组

题目描述

原题链接

给你一个下标从0开始的数组nums,数组长度为n

nums的 不同元素数目差 数组可以用一个长度为n的数组diff表示,其中diff[i]等于前缀nums[0, ..., i]中不同元素的数目 减去 后缀nums[i + 1, ..., n - 1]中不同元素的数目。

返回nums的 不同元素数目差 数组。

注意nums[i, ..., j]表示nums的一个从下标i开始到下标j结束的子数组(包含下标ij 对应元素)。特别需要说明的是,如果i > j,则nums[i, ..., j]表示一个空子数组。

问题分析

可以先进行一次遍历,用哈希表存储数组中每个元素的个数。

然后第二遍遍历计算前缀和后缀只差。具体计算过程如下:

  1. 指针移动
  2. 哈希表中减去当前元素,若当前元素个数为0,则后缀不同元素个数减1
  3. 将当前元素加入一个集合set,集合元素个数即为前缀不同元素个数
  4. 计算前后缀元素个数之差,加入结果集

程序代码

class Solution {
public:
    vector<int> distinctDifferenceArray(vector<int>& nums) {
        int n = nums.size();
        unordered_map<int, int> mp;
        for(auto num : nums) {
            mp[num]++;
        }
        unordered_set<int> st;
        vector<int> res;
        int t = mp.size();
        for(auto num : nums) {
            mp[num]--;
            if(mp[num] == 0)  t--;
            st.insert(num);  
            res.push_back(st.size() - t);
        }
        return res;
    }
};
  • 9
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值