Difficulty: Hard
Topics:
Array , Binary Search , Binary Indexed Tree , Divide and Conquer , Merge Sort , Ordered Set , Segment Tree
Hint:
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.
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.
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).
https://leetcode.com/problems/count-good-triplets-in-an-array/
Loading component...
Loading component...
Input: nums1 = [2,0,1,3], nums2 = [0,1,2,3]
Output: 1
public static void main(String[] args) {
int[] nums1 = {2, 0, 1, 3};
int[] nums2 = {0, 1, 2, 3};
long result = goodTriplets(nums1, nums2);
System.out.println("Number of good triplets: " + result);
} //Function End
public static long goodTriplets(int[] nums1, int[] nums2) {
HashMap<Integer, Integer> mpp = new HashMap<>();
for (int i = 0; i < nums1.length; i++) {
mpp.put(nums1[i], i);
} //Loop End
int n = nums2.length;
long total = 0;
ArrayList<Integer> st = new ArrayList<>();
for (int x : nums2) {
int idx = mpp.get(x);
int left = orderOfKey(st, idx);
int right = (n - 1 - idx) - (st.size() - left);
total += (long) left * right;
int pos = Collections.binarySearch(st, idx);
if (pos < 0) {
pos = -pos - 1;
} //If End
st.add(pos, idx);
} //Loop End
return total;
} //Function End
private static int orderOfKey(ArrayList<Integer> st, int key) {
int pos = Collections.binarySearch(st, key);
return pos < 0 ? -pos - 1 : pos;
} //Function End