Off-by-one on range boundaries
Wrong move: Loop endpoints miss first/last candidate.
Usually fails on: Fails on minimal arrays and exact-boundary answers.
Fix: Re-derive loops from inclusive/exclusive ranges before coding.
Build confidence with an intuition-first walkthrough focused on array fundamentals.
nums of length n and an integer k, return the number of pairs (i, j) where 0 <= i < j < n, such that nums[i] == nums[j] and (i * j) is divisible by k.
Example 1:
Input: nums = [3,1,2,2,2,1,3], k = 2 Output: 4 Explanation: There are 4 pairs that meet all the requirements: - nums[0] == nums[6], and 0 * 6 == 0, which is divisible by 2. - nums[2] == nums[3], and 2 * 3 == 6, which is divisible by 2. - nums[2] == nums[4], and 2 * 4 == 8, which is divisible by 2. - nums[3] == nums[4], and 3 * 4 == 12, which is divisible by 2.
Example 2:
Input: nums = [1,2,3,4], k = 1 Output: 0 Explanation: Since no value in nums is repeated, there are no pairs (i,j) that meet all the requirements.
Constraints:
1 <= nums.length <= 1001 <= nums[i], k <= 100Problem summary: Given a 0-indexed integer array nums of length n and an integer k, return the number of pairs (i, j) where 0 <= i < j < n, such that nums[i] == nums[j] and (i * j) is divisible by k.
Start with the most direct exhaustive search. That gives a correctness anchor before optimizing.
Pattern signal: Array
[3,1,2,2,2,1,3] 2
[1,2,3,4] 1
count-number-of-pairs-with-absolute-difference-k)count-number-of-bad-pairs)Source-backed implementations are provided below for direct study and interview prep.
// Accepted solution for LeetCode #2176: Count Equal and Divisible Pairs in an Array
class Solution {
public int countPairs(int[] nums, int k) {
int ans = 0;
for (int j = 1; j < nums.length; ++j) {
for (int i = 0; i < j; ++i) {
ans += nums[i] == nums[j] && (i * j % k) == 0 ? 1 : 0;
}
}
return ans;
}
}
// Accepted solution for LeetCode #2176: Count Equal and Divisible Pairs in an Array
func countPairs(nums []int, k int) (ans int) {
for j, y := range nums {
for i, x := range nums[:j] {
if x == y && (i*j%k) == 0 {
ans++
}
}
}
return
}
# Accepted solution for LeetCode #2176: Count Equal and Divisible Pairs in an Array
class Solution:
def countPairs(self, nums: List[int], k: int) -> int:
ans = 0
for j in range(1, len(nums)):
for i, x in enumerate(nums[:j]):
ans += int(x == nums[j] and i * j % k == 0)
return ans
// Accepted solution for LeetCode #2176: Count Equal and Divisible Pairs in an Array
impl Solution {
pub fn count_pairs(nums: Vec<i32>, k: i32) -> i32 {
let mut ans = 0;
for j in 1..nums.len() {
for (i, &x) in nums[..j].iter().enumerate() {
if x == nums[j] && (i * j) as i32 % k == 0 {
ans += 1;
}
}
}
ans
}
}
// Accepted solution for LeetCode #2176: Count Equal and Divisible Pairs in an Array
function countPairs(nums: number[], k: number): number {
let ans = 0;
for (let j = 1; j < nums.length; ++j) {
for (let i = 0; i < j; ++i) {
if (nums[i] === nums[j] && (i * j) % k === 0) {
++ans;
}
}
}
return ans;
}
Use this to step through a reusable interview workflow for this problem.
Two nested loops check every pair or subarray. The outer loop fixes a starting point, the inner loop extends or searches. For n elements this gives up to n²/2 operations. No extra space, but the quadratic time is prohibitive for large inputs.
Most array problems have an O(n²) brute force (nested loops) and an O(n) optimal (single pass with clever state tracking). The key is identifying what information to maintain as you scan: a running max, a prefix sum, a hash map of seen values, or two pointers.
Review these before coding to avoid predictable interview regressions.
Wrong move: Loop endpoints miss first/last candidate.
Usually fails on: Fails on minimal arrays and exact-boundary answers.
Fix: Re-derive loops from inclusive/exclusive ranges before coding.