Understand Count Good Triplets in an Array Problem

Problem Name: Count Good Triplets in an Array
Problem Description:

Count Good Triplets in an Array

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.


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 n = \text{nums1.length} = \text{nums2.length}
  • 3n1053 \le n \le 10^5
  • 0nums1[i], nums2[i]n1 0 \le \text{nums1}[i], \ \text{nums2}[i] \le n - 1
  • nums1 and nums2 are permutations of {0,1,,n1}\text{nums1 and nums2 are permutations of } \{ 0, 1, \dots, n - 1 \}
Category:
  • Arrays
  • Sorting
Programming Language:
  • Java
Reference Link:

https://leetcode.com/problems/count-good-triplets-in-an-array/

Online IDE

Scroll down for output
Java
Output:

Loading component...

Loading component...

Tracking code (View only. In case you want to track the code, click this button):
Main Function:

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

Helper Function:

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

Utility Functions and Global variables:

private static int orderOfKey(ArrayList<Integer> st, int key) {

int pos = Collections.binarySearch(st, key);

return pos < 0 ? -pos - 1 : pos;

} //Function End