2021-05-14 18:30:49 +02:00
|
|
|
|
# Challenge name: Number of good pairs
|
|
|
|
|
#
|
|
|
|
|
# Given an array of integers nums.
|
|
|
|
|
# A pair (i,j) is called good if nums[i] == nums[j] and i < j.
|
|
|
|
|
# Return the number of good pairs.
|
|
|
|
|
#
|
|
|
|
|
# @param {Integer[]} nums
|
|
|
|
|
# @return {Integer}
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# Approach 1: Hash
|
|
|
|
|
#
|
|
|
|
|
# Time Complexity: O(n)
|
|
|
|
|
def num_identical_pairs(nums)
|
|
|
|
|
hash = Hash.new(0)
|
|
|
|
|
|
|
|
|
|
nums.each do |num|
|
|
|
|
|
hash[num] = hash[num] + 1
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
counter = 0
|
|
|
|
|
# Count how many times each number appears.
|
|
|
|
|
# If a number appears n times, then n * (n – 1) / 2 good pairs
|
|
|
|
|
# can be made with this number.
|
|
|
|
|
hash.values.each do |val|
|
|
|
|
|
counter += (val * (val - 1) / 2)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
counter
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
nums = [1, 2, 3, 1, 1, 3]
|
|
|
|
|
puts(num_identical_pairs(nums))
|
|
|
|
|
# Output: 4
|
|
|
|
|
|
|
|
|
|
nums = [1, 1, 1, 1]
|
|
|
|
|
puts(num_identical_pairs(nums))
|
|
|
|
|
# Output: 6
|
|
|
|
|
|
|
|
|
|
nums = [1, 2, 3]
|
|
|
|
|
puts(num_identical_pairs(nums))
|
2021-09-03 22:24:58 +02:00
|
|
|
|
# Output: 0
|