2025-04-15 Daily Challenge
Today I have done leetcode's April LeetCoding Challenge with cpp
.
April LeetCoding Challenge 15
Description
Count Good Triplets in an Array
You are given two 0-indexed arrays nums1
and nums2
of length n
, both of which are permutations of [0, 1, ..., n - 1]
.
A good triplet is a set of 3
distinct values which are present in increasing order by position both in nums1
and nums2
. In other words, if we consider pos1v
as the index of the value v
in nums1
and pos2v
as the index of the value v
in nums2
, then a good triplet will be a set (x, y, z)
where 0 <= x, y, z <= n - 1
, such that pos1x < pos1y < pos1z
and pos2x < pos2y < pos2z
.
Return the total number of good triplets.
Example 1:
Input: nums1 = [2,0,1,3], nums2 = [0,1,2,3] Output: 1 Explanation: There are 4 triplets (x,y,z) such that pos1x < pos1y < pos1z. They are (2,0,1), (2,0,3), (2,1,3), and (0,1,3). Out of those triplets, only the triplet (0,1,3) satisfies pos2x < pos2y < pos2z. Hence, there is only 1 good triplet.
Example 2:
Input: nums1 = [4,0,1,3,2], nums2 = [4,1,0,2,3] Output: 4 Explanation: The 4 good triplets are (4,0,3), (4,0,2), (4,1,3), and (4,1,2).
Constraints:
n == nums1.length == nums2.length
3 <= n <= 105
0 <= nums1[i], nums2[i] <= n - 1
nums1
andnums2
are permutations of[0, 1, ..., n - 1]
.
Solution
inline constexpr int lowbit(int x) {
return x & -x;
}
class BITS {
int size = 0;
vector<int> container;
public:
BITS(int n): container(n), size(n) {}
void add(int x, int val) {
while(x < size) {
container[x] += val;
x += lowbit(x);
}
}
int sum(int x) {
int result = 0;
while(x) {
result += container[x];
x -= lowbit(x);
}
return result;
}
};
class Solution {
public:
long long goodTriplets(vector<int>& nums1, vector<int>& nums2) {
int len = nums1.size();
vector<int> pos2(len);
for(int i = 0; i < len; ++i) {
pos2[nums2[i]] = i;
}
vector<int> indexMapping(len);
for(int i = 0; i < len; ++i) {
indexMapping[pos2[nums1[i]]] = i;
}
BITS bit(len + 1);
long long answer = 0;
for(int val = 0; val < len; ++val) {
int pos = indexMapping[val];
int left = bit.sum(pos + 1);
bit.add(pos + 1, 1);
int right = (len - 1 - pos) - (val - left);
answer += 1LL * left * right;
}
return answer;
}
};
// Accepted
// 148/148 cases passed (17 ms)
// Your runtime beats 88.78 % of cpp submissions
// Your memory usage beats 84.62 % of cpp submissions (87.9 MB)