DEV Community

ZeeshanAli-0704
ZeeshanAli-0704

Posted on

3

Count Number of Nice Subarrays

Let's go through the code step by step to understand how it calculates the number of "nice" subarrays, where a "nice" subarray contains exactly k odd numbers.

Count Number of Nice Subarrays

Code Explanation

The function numberOfSubarrays uses a sliding window approach to count subarrays with exactly k odd numbers.

Initial State

  • countOdd = 0: Keeps track of the number of odd numbers in the current window.
  • l = 0: The left pointer of the sliding window.
  • m = 0: A pointer to help count subarrays starting from l.
  • result = 0: Accumulates the total number of nice subarrays found.

Iteration Over the Array

for (let r = 0; r < nums.length; r++) {
    if (nums[r] % 2 !== 0) {
        countOdd++;
    }
Enter fullscreen mode Exit fullscreen mode
  • The loop iterates through the array with the right pointer r.
  • For each element nums[r], if it is odd, countOdd is incremented.

Adjusting the Left Pointer (l)

while (countOdd > k) {
    if (nums[l] % 2 !== 0) {
        countOdd--;
    }
    l++;
    m = l;
}
Enter fullscreen mode Exit fullscreen mode
  • When countOdd exceeds k, the left pointer l is moved to the right until countOdd is equal to k.
  • If the element at l is odd, decrement countOdd.
  • Move l to the right and set m to l.

Counting Valid Subarrays

if (countOdd === k) {
    while (nums[m] % 2 === 0) {
        m++;
    }
    result += (m - l) + 1;
}
Enter fullscreen mode Exit fullscreen mode
  • When countOdd is equal to k, count the number of valid subarrays.
  • Move pointer m to the right as long as the elements are even.
  • The number of valid subarrays ending at r is (m - l) + 1.
  • Add this count to result.

Return the Result

return result;
Enter fullscreen mode Exit fullscreen mode
  • Return the total count of nice subarrays.

Example Walkthrough

Let's consider the array nums = [2, 2, 2, 1, 2, 2, 1, 2, 2, 2] with k = 2.

Initial State

  • countOdd = 0
  • l = 0
  • m = 0
  • result = 0

Iteration Over nums

Iteration 1 to 3 (r = 0 to 2)

  • All elements are even, countOdd remains 0.

Iteration 4 (r = 3)

  • nums[3] = 1, countOdd = 1.

Iteration 5 to 6 (r = 4 to 5)

  • All elements are even, countOdd remains 1.

Iteration 7 (r = 6)

  • nums[6] = 1, countOdd = 2.
  • countOdd is now equal to k.
  • Move m to 6 (where nums[m] = 1).
  • result += (6 - 3) + 1 = 4.

Iteration 8 (r = 7)

  • nums[7] = 2, countOdd remains 2.
  • m remains 6.
  • result += (6 - 3) + 1 = 4.
  • result is now 8.

Iteration 9 (r = 8)

  • nums[8] = 2, countOdd remains 2.
  • m remains 6.
  • result += (6 - 3) + 1 = 4.
  • result is now 12.

Iteration 10 (r = 9)

  • nums[9] = 2, countOdd remains 2.
  • m remains 6.
  • result += (6 - 3) + 1 = 4.
  • result is now 16.

Final Calculation

Return result, which is 16.

Summary

The algorithm effectively uses two pointers to maintain a sliding window and count subarrays with exactly k odd numbers. It correctly counts all valid subarrays ending at each position r, ensuring efficient and accurate calculation.

var numberOfSubarrays = function (nums, k) {
    let countOdd = 0;
    let l = 0;
    let m = 0;
    let result = 0;

    for (let r = 0; r < nums.length; r++) {
        if (nums[r] % 2 !== 0) {
            countOdd++;
        }

        while (countOdd > k) {
            if (nums[l] % 2 !== 0) {
                countOdd--;
            }
            l++;
            m = l;
        }
        if (countOdd === k) {
            while (nums[m] % 2 == 0) {
                m++
            }

            result += (m - l) + 1;
        }

    }
    return result;
};
Enter fullscreen mode Exit fullscreen mode

Sentry image

Hands-on debugging session: instrument, monitor, and fix

Join Lazar for a hands-on session where you’ll build it, break it, debug it, and fix it. You’ll set up Sentry, track errors, use Session Replay and Tracing, and leverage some good ol’ AI to find and fix issues fast.

RSVP here →

Top comments (0)

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay