📌  相关文章
📜  在应用给定的操作 q 次后,找出数组中不同数字的数量(1)

📅  最后修改于: 2023-12-03 15:23:32.758000             🧑  作者: Mango

题目描述

给定一个长度为n的整数数组,进行q次操作,每次操作将区间[l, r]内的所有数加上val,最后输出数组中不同数字的数量。

解题思路

首先看到这道题目,很容易想到暴力解法,即对每次操作后的数组进行去重统计。但是这种做法的时间复杂度为O(qnlogn),无法通过本题。

我们可以利用哈希表来解决这个问题。对于每次操作,我们将区间[l, r]内的所有数加上val后,统计数组中每个数字出现的次数。最后遍历哈希表,计算不同数字的数量即可。

具体实现时,使用unordered_map来实现哈希表,时间复杂度为O(qn)。

代码实现
#include <iostream>
#include <unordered_map>
using namespace std;

int main()
{
    int n, q;
    cin >> n >> q;
    int a[n+1], val[n+1] = {0};
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i];
    }
    while (q--)
    {
        int l, r, v;
        cin >> l >> r >> v;
        val[l] += v;
        if (r+1 <= n)
        {
            val[r+1] -= v;
        }
    }
    unordered_map<int, int> mp;
    for (int i = 1; i <= n; i++)
    {
        val[i] += val[i-1];
        mp[a[i]+val[i]]++;
    }
    cout << mp.size() << endl;
    return 0;
}

Markdown演示效果:

给定一个长度为n的整数数组,进行q次操作,每次操作将区间[l, r]内的所有数加上val,最后输出数组中不同数字的数量。

我们可以利用哈希表来解决这个问题。对于每次操作,我们将区间[l, r]内的所有数加上val后,统计数组中每个数字出现的次数。最后遍历哈希表,计算不同数字的数量即可。

具体实现时,使用unordered_map来实现哈希表,时间复杂度为O(qn)。

#include <iostream>
#include <unordered_map>
using namespace std;

int main()
{
    int n, q;
    cin >> n >> q;
    int a[n+1], val[n+1] = {0};
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i];
    }
    while (q--)
    {
        int l, r, v;
        cin >> l >> r >> v;
        val[l] += v;
        if (r+1 <= n)
        {
            val[r+1] -= v;
        }
    }
    unordered_map<int, int> mp;
    for (int i = 1; i <= n; i++)
    {
        val[i] += val[i-1];
        mp[a[i]+val[i]]++;
    }
    cout << mp.size() << endl;
    return 0;
}