Problem Statement

Brute Force [TLE]
class Solution:
def countBadPairs(self, nums: List[int]) -> int:
N = len(nums)
res = 0
for i in range(N - 1):
for j in range(i + 1, N):
if j - i != nums[j] - nums[i]:
res += 1
return res
Discussion Solution
class Solution:
def countBadPairs(self, nums: List[int]) -> int:
d = defaultdict(int)
good_pairs = 0
for i in range(len(nums)):
diff = nums[i] - i
good_pairs += d[diff]
d[diff] += 1
n = len(nums)
total_pairs = n * (n - 1) // 2
return total_pairs - good_pairs
Editorial
Approach: Hash Map
class Solution:
def countBadPairs(self, nums: List[int]) -> int:
bad_pairs = 0
diff_count = {}
for pos in range(len(nums)):
diff = pos - nums[pos]
# Count of previous positions with same difference
good_pairs_count = diff_count.get(diff, 0)
# Total possible pairs minus good pairs = bad pairs
bad_pairs += pos - good_pairs_count
# Update count of positions with this difference
diff_count[diff] = good_pairs_count + 1
return bad_pairs