Find the Distinct Difference Array

easy array hash set prefix sum

Problem

You are given a 0-indexed array nums of length n. The distinct difference array diff has the same length, where diff[i] equals the number of distinct elements in the prefix nums[0..i] minus the number of distinct elements in the suffix nums[i+1..n-1]. Return diff.

Inputnums = [1,2,3,4,5]
Output[-3,-1,1,3,5]
At i=0: prefix {1} has 1 distinct, suffix {2,3,4,5} has 4, so 1 − 4 = −3.

def distinct_difference_array(nums):
    n = len(nums)
    suffix = [0] * (n + 1)
    seen = set()
    for i in range(n - 1, -1, -1):
        seen.add(nums[i])
        suffix[i] = len(seen)
    diff = [0] * n
    prefix = set()
    for i in range(n):
        prefix.add(nums[i])
        diff[i] = len(prefix) - suffix[i + 1]
    return diff
function distinctDifferenceArray(nums) {
  const n = nums.length;
  const suffix = new Array(n + 1).fill(0);
  const seen = new Set();
  for (let i = n - 1; i >= 0; i--) {
    seen.add(nums[i]);
    suffix[i] = seen.size;
  }
  const diff = new Array(n).fill(0);
  const prefix = new Set();
  for (let i = 0; i < n; i++) {
    prefix.add(nums[i]);
    diff[i] = prefix.size - suffix[i + 1];
  }
  return diff;
}
class Solution {
    public int[] distinctDifferenceArray(int[] nums) {
        int n = nums.length;
        int[] suffix = new int[n + 1];
        Set<Integer> seen = new HashSet<>();
        for (int i = n - 1; i >= 0; i--) {
            seen.add(nums[i]);
            suffix[i] = seen.size();
        }
        int[] diff = new int[n];
        Set<Integer> prefix = new HashSet<>();
        for (int i = 0; i < n; i++) {
            prefix.add(nums[i]);
            diff[i] = prefix.size() - suffix[i + 1];
        }
        return diff;
    }
}
vector<int> distinctDifferenceArray(vector<int>& nums) {
    int n = nums.size();
    vector<int> suffix(n + 1, 0);
    unordered_set<int> seen;
    for (int i = n - 1; i >= 0; i--) {
        seen.insert(nums[i]);
        suffix[i] = seen.size();
    }
    vector<int> diff(n);
    unordered_set<int> prefix;
    for (int i = 0; i < n; i++) {
        prefix.insert(nums[i]);
        diff[i] = (int)prefix.size() - suffix[i + 1];
    }
    return diff;
}
Time: O(n) Space: O(n)