Merge Triplets to Form Target Triplet
Merging Triplets to Form a Target Triplet
The Merge Triplets to Form Target problem involves determining whether you can construct a specific triplet using a series of merging operations on given triplets.
This article will guide you through understanding the problem, breaking it down, and implementing an efficient solution.
Problem Description
Input
- triplets: A 2D list where each triplet is of the form [a, b, c].
- target: A triplet [x, y, z] that we aim to construct.
Operation
For two triplets triplets[i] = [ai, bi, ci] and triplets[j] = [aj, bj, cj], you can update triplets[j] as follows:
triplets[j]=[max(ai,aj),max(bi,bj),max(ci,cj)]
Goal
Determine whether it is possible to make target an element of triplets after performing the allowed operations.
Example 1
Input: triplets = [[1,2,3],[7,1,1]], target = [7,2,3]
Output: true
Explanation:
The cards can be rearranged as [1,2,3,4] and [2,3,4,5].
Example 2
Input: triplets = [[2,5,6],[1,4,4],[5,7,5]], target = [5,4,6]
Output: false
Constraints:
- 1 <= triplets.length <= 1000
- 1 <= ai, bi, ci, x, y, z <= 100
There are mainly two approach to solve this problem –
- Greedy
- Greedy (Optimal)
1. Greedy
- Time complexity: O(n)
- Space complexity: O(1)
Python
C++
Java
JavaScript
Python
class Solution: def mergeTriplets(self, triplets: List[List[int]], target: List[int]) -> bool: good = set() for t in triplets: if t[0] > target[0] or t[1] > target[1] or t[2] > target[2]: continue for i, v in enumerate(t): if v == target[i]: good.add(i) return len(good) == 3
C++
class Solution { public: bool isNStraightHand(vector& hand, int groupSize) { if (hand.size() % groupSize != 0) return false; unordered_map count; for (int num : hand) count[num]++; sort(hand.begin(), hand.end()); for (int num : hand) { if (count[num] > 0) { for (int i = num; i < num + groupSize; i++) { if (count[i] == 0) return false; count[i]--; } } } return true; } };
Java
public class Solution { public boolean mergeTriplets(int[][] triplets, int[] target) { Setgood = new HashSet<>(); for (int[] t : triplets) { if (t[0] > target[0] || t[1] > target[1] || t[2] > target[2]) { continue; } for (int i = 0; i < t.length; i++) { if (t[i] == target[i]) { good.add(i); } } } return good.size() == 3; } }
JavaScript
class Solution { /** * @param {number[][]} triplets * @param {number[]} target * @return {boolean} */ mergeTriplets(triplets, target) { const good = new Set(); for (const t of triplets) { if (t[0] > target[0] || t[1] > target[1] || t[2] > target[2]) { continue; } for (let i = 0; i < t.length; i++) { if (t[i] === target[i]) { good.add(i); } } } return good.size === 3; } }
2. Greedy (Optimal)
Time & Space Complexity
- Time complexity: O(n)
- Space complexity: O(1)
C++
Java
Python
JavaScript
C++
class Solution { public: bool mergeTriplets(vector>& triplets, vector & target) { bool x = false, y = false, z = false; for (const auto& t : triplets) { x |= (t[0] == target[0] && t[1] <= target[1] && t[2] <= target[2]); y |= (t[0] <= target[0] && t[1] == target[1] && t[2] <= target[2]); z |= (t[0] <= target[0] && t[1] <= target[1] && t[2] == target[2]); if (x && y && z) return true; } return false; } };
Java
public class Solution { public boolean mergeTriplets(int[][] triplets, int[] target) { boolean x = false, y = false, z = false; for (int[] t : triplets) { x |= (t[0] == target[0] && t[1] <= target[1] && t[2] <= target[2]); y |= (t[0] <= target[0] && t[1] == target[1] && t[2] <= target[2]); z |= (t[0] <= target[0] && t[1] <= target[1] && t[2] == target[2]); if (x && y && z) { return true; } } return false; } }
Python
class Solution: def mergeTriplets(self, triplets: List[List[int]], target: List[int]) -> bool: x = y = z = False for t in triplets: x |= (t[0] == target[0] and t[1] <= target[1] and t[2] <= target[2]) y |= (t[0] <= target[0] and t[1] == target[1] and t[2] <= target[2]) z |= (t[0] <= target[0] and t[1] <= target[1] and t[2] == target[2]) if x and y and z: return True return False
JavaScript
class Solution { /** * @param {number[][]} triplets * @param {number[]} target * @return {boolean} */ mergeTriplets(triplets, target) { let x = false, y = false, z = false; for (let t of triplets) { x |= (t[0] === target[0] && t[1] <= target[1] && t[2] <= target[2]); y |= (t[0] <= target[0] && t[1] === target[1] && t[2] <= target[2]); z |= (t[0] <= target[0] && t[1] <= target[1] && t[2] === target[2]); if (x && y && z) return true; } return false; } }