1814. Count Nice Pairs in an Array

Blog

You are given an array nums that consists of non-negative integers. Let us define rev(x) as the reverse of the non-negative integer x. For example, rev(123) = 321, and rev(120) = 21. A pair of indices (i, j) is nice if it satisfies all of the following conditions:

  • 0 <= i < j < nums.length
  • nums[i] + rev(nums[j]) == nums[j] + rev(nums[i])

Return the number of nice pairs of indices. Since that number can be too large, return it modulo 109 + 7.

Example: 1

Input: nums = [42,11,1,97]

Output: 2

Example: 2

Input: nums = [13,10,35,24,76]

Output: 4

Constraints:
  • 1 <= nums.length <= 10 ^ 5
  • 0 <= nums[i] <= 10 ^ 9
Step I (Changing the given equation a bit):
  • The original equation is : nums[i] + rev(nums[j]) == nums[j] + rev(nums[i]).
  • So if we bring rev(nums[i]) to left and take rev(nums[j]) to the right, the equation will become : nums[i] - rev(nums[i]) == nums[j] - rev(nums[j]).
  • Here we can see that the sum of nums[i] - rev(nums[i]) must be equal to nums[j] - rev(nums[j]), for forming correct pairs.
Step II (Implementation):
  • All we have to do now is to add up all nums[i] + rev(nums[i]) and store their count.
  • Let's say there are N numbers having a particular sum Y. Then number of unique pairs will be : N * (N - 1) / 2.
  • We will do this for all numbers formed by adding num and it's reverse, and then add the result together. This will be our final answer.
Full Code (Java): class Solution { public int countNicePairs(int[] nums) { HashMap<Long, Integer> map = new HashMap<>(); for(int i : nums) { long a = i; long b = Long.parseLong(new StringBuilder("" + a).reverse().toString()); map.put(a - b, map.getOrDefault(a - b, 0) + 1); } long ans = 0; for(long key : map.keySet()) { long count = map.get(key); ans += (count * (count - 1)) / 2L; } return (int)(ans % 1000_000_007L); } }

Comments

Popular posts from this blog

123. Best Time to Buy and Sell Stock III

1819. Number of Different Subsequences GCDs (Leetcode)

1872. Stone Game VIII