The distinct difference array of nums is an array diff of length n
such that diff[i] is equal to the number of distinct elements in the suffix
nums[i + 1, ..., n - 1]subtracted from the number of distinct elements in the prefix nums[0, ..., i].
Return _thedistinct difference array of _nums.
Note that nums[i, ..., j] denotes the subarray of nums starting at index
i and ending at index j inclusive. Particularly, if i > j then nums[i, ..., j] denotes an empty subarray.
Input: nums =[1,2,3,4,5] Output:[-3,-1,1,3,5] Explanation: For index i =0, there is1 element in the prefix and 4 distinct elements in the suffix. Thus, diff[0]=1-4=-3. For index i =1, there are 2 distinct elements in the prefix and 3 distinct elements in the suffix. Thus, diff[1]=2-3=-1. For index i =2, there are 3 distinct elements in the prefix and 2 distinct elements in the suffix. Thus, diff[2]=3-2=1. For index i =3, there are 4 distinct elements in the prefix and 1 distinct element in the suffix. Thus, diff[3]=4-1=3. For index i =4, there are 5 distinct elements in the prefix and no elements in the suffix. Thus, diff[4]=5-0=5.
Input: nums =[3,2,3,4,2] Output:[-2,-1,0,2,3] Explanation: For index i =0, there is1 element in the prefix and 3 distinct elements in the suffix. Thus, diff[0]=1-3=-2. For index i =1, there are 2 distinct elements in the prefix and 3 distinct elements in the suffix. Thus, diff[1]=2-3=-1. For index i =2, there are 2 distinct elements in the prefix and 2 distinct elements in the suffix. Thus, diff[2]=2-2=0. For index i =3, there are 3 distinct elements in the prefix and 1 distinct element in the suffix. Thus, diff[3]=3-1=2. For index i =4, there are 3 distinct elements in the prefix and no elements in the suffix. Thus, diff[4]=3-0=3.
For each index, count the number of distinct elements in the prefix and the suffix. Use sets to efficiently track unique elements as you sweep from left and right.
classSolution {
publicint[]distinctDifferenceArray(int[] nums) {
int n = nums.length;
int[] pre =newint[n], suf =newint[n], ans =newint[n];
Set<Integer> s =new HashSet<>();
for (int i = 0; i < n; ++i) {
s.add(nums[i]);
pre[i]= s.size();
}
s.clear();
for (int i = n-1; i >= 0; --i) {
suf[i]= s.size();
s.add(nums[i]);
}
for (int i = 0; i < n; ++i) ans[i]= pre[i]- suf[i];
return ans;
}
}
classSolution {
fundistinctDifferenceArray(nums: IntArray): IntArray {
val n = nums.size
val pre = IntArray(n)
val suf = IntArray(n)
val ans = IntArray(n)
val s = mutableSetOf<Int>()
for (i in0 until n) {
s.add(nums[i])
pre[i] = s.size
}
s.clear()
for (i in n-1 downTo 0) {
suf[i] = s.size
s.add(nums[i])
}
for (i in0 until n) ans[i] = pre[i] - suf[i]
return ans
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
classSolution:
defdistinctDifferenceArray(self, nums: list[int]) -> list[int]:
n = len(nums)
pre, suf, ans = [0]*n, [0]*n, [0]*n
s = set()
for i in range(n):
s.add(nums[i])
pre[i] = len(s)
s.clear()
for i in range(n-1, -1, -1):
suf[i] = len(s)
s.add(nums[i])
for i in range(n):
ans[i] = pre[i] - suf[i]
return ans
use std::collections::HashSet;
impl Solution {
pubfndistinct_difference_array(nums: Vec<i32>) -> Vec<i32> {
let n = nums.len();
letmut pre =vec![0; n];
letmut suf =vec![0; n];
letmut ans =vec![0; n];
letmut s = HashSet::new();
for i in0..n {
s.insert(nums[i]);
pre[i] = s.len() asi32;
}
s.clear();
for i in (0..n).rev() {
suf[i] = s.len() asi32;
s.insert(nums[i]);
}
for i in0..n {
ans[i] = pre[i] - suf[i];
}
ans
}
}