Count Triplets

Sort by

recency

|

817 Discussions

|

  • + 0 comments

    First we import defaultdictionary from collections module. Then, use this code for better Understanding: def countTriplets(arr, r): total_pairs = 0 count2={} count3={} for num in arr: if num in count3: total_pairs+=count3[num] if num in count2: count3[num*r]=count3.get(num*r, 0) + count2[num] count2[num*r]=count2.get(num*r, 0) + 1 return total_pairs

  • + 0 comments

    Easy to understand Python code

    from collections import Counter, defaultdict
    
    def countTriplets(arr, r):
        left = defaultdict(int)
        right = Counter(arr)
        
        res = 0
        for a in arr:
            right[a] -= 1
            cl = left[a/r]
            cr = right[a * r]
            res += cl * cr
            left[a] += 1
            
        return res
    
  • + 0 comments

    Cleanest python solution:

    from collections import defaultdict
    def countTriplets(nums, r):
        
        lefts = defaultdict(int)
        pairs = defaultdict(int)
        
        res = 0
        for n in nums:
            res += pairs[n]
                    
            pairs[n*r] += lefts[n]
            
            lefts[n*r] += 1
            
        return res
    

    Can be made more succint using a key transform and one dictionary:

    from collections import defaultdict
    def countTriplets(nums, r):
        lefts, res = defaultdict(int),0
        
        for n in nums:
            res += lefts[-n]
            lefts[-n*r] += lefts[n]
            lefts[n*r] += 1
            
        return res
    
  • + 0 comments

    This one was a doozy! Took me way longer then I'd care to admit. JS solution (forgive my nesting 😅):

    function countTriplets(arr, r) {
        let result = 0;
        
        const values = {};
        const pairs = {};
        
        for(const v of arr) {
          const prev = v/r;
          
          if(prev in values) {
            if (prev in pairs) result += pairs[prev];
            
            pairs[v] = (pairs[v] ?? 0) + values[prev];
          }
          
          values[v] = (values[v] ?? 0) + 1;
        }
        
        return result;
    }
    
  • + 0 comments

    Why is this failing hidden test case 6 :(

    I came up with idea of moving forward and keeping a track of singles and doubles that have happened. This is passing all test cases except test case 6 :(

    static long countTriplets(List<long> arr, long r)
    {
        Dictionary<long, long> singles = new();
        Dictionary<long, long> doubles = new();
        long count = 0;
    
        foreach (var num in arr)
        {
            long keyByr = num / r;
    
            // If num completes a triplet
            if (doubles.ContainsKey(keyByr))
            {
                count += doubles[keyByr];
            }
    
            // If num can be a middle of triplet
            if (singles.ContainsKey(keyByr))
            {
                if (doubles.ContainsKey(num))
                    doubles[num] += singles[keyByr];
                else
                    doubles[num] = singles[keyByr];
            }
    
            // Count num as potential start
            if (singles.ContainsKey(num))
                singles[num]++;
            else
                singles[num] = 1;
        }
    
        return count;
    }