diff --git a/Problems/2401 - Longest Nice Subarray - Medium/Explanation.md b/Problems/2401 - Longest Nice Subarray - Medium/Explanation.md new file mode 100644 index 0000000..b543edb --- /dev/null +++ b/Problems/2401 - Longest Nice Subarray - Medium/Explanation.md @@ -0,0 +1,40 @@ +# Explanation of the Code + +## **Objective** +The goal of the program is to find the length of the longest "nice" subarray within the input array `nums`. A subarray is considered "nice" if the bitwise AND operation between every pair of elements in the subarray results in `0`. The program efficiently calculates this using a sliding window approach. + +--- + +## **Step-by-Step Explanation** + +### **1. Initialize Variables** +```java +int maxLength = 1, left = 0, usedBits = 0; + +for (int right = 0; right < nums.length; right++) { + while ((usedBits & nums[right]) != 0) { + usedBits ^= nums[left++]; + } + usedBits |= nums[right]; + maxLength = Math.max(maxLength, right - left + 1); +} +Outer Loop (for): Iterates through each element of the array using the right pointer, which represents the end of the current window. + +Inner Loop (while): +(usedBits & nums[right]) != 0: Checks if adding the current element (nums[right]) to the subarray would result in a bitwise AND operation that is non-zero, which violates the "nice" condition. + +usedBits ^= nums[left++]: Removes the element at the left pointer from the subarray by performing a bitwise XOR, effectively shrinking the window from the left until the subarray is "nice" again. + +Update Subarray: +usedBits |= nums[right]: Adds the current element (nums[right]) to the subarray by updating the usedBits variable using a bitwise OR operation. + +maxLength = Math.max(maxLength, right - left + 1): Updates the maximum length of the "nice" subarray encountered so far. + +return maxLength; +Returns the length of the longest "nice" subarray. + +Time Complexity: O(n) +Each element is added and removed from the window at most once, making the overall traversal linear. + +Space Complexity: O(1) +We use only a few integer variables. \ No newline at end of file diff --git a/Problems/2401 - Longest Nice Subarray - Medium/Solution.java b/Problems/2401 - Longest Nice Subarray - Medium/Solution.java new file mode 100644 index 0000000..9ec5000 --- /dev/null +++ b/Problems/2401 - Longest Nice Subarray - Medium/Solution.java @@ -0,0 +1,13 @@ +class Solution { + public int longestNiceSubarray(int[] nums) { + int maxLength = 1, left = 0, usedBits = 0; + for (int right = 0; right < nums.length; right++) { + while ((usedBits & nums[right]) != 0) { + usedBits ^= nums[left++]; + } + usedBits |= nums[right]; + maxLength = Math.max(maxLength, right - left + 1); + } + return maxLength; + } +}