Longest Nice Subarray

medium array bit manipulation sliding window

Problem

You are given an array of positive integers nums. A subarray is called "nice" if every pair of its elements has a bitwise AND equal to 0 — in other words, no two elements share a common set bit. Return the length of the longest nice subarray. A single element is always nice.

Inputnums = [1, 3, 8, 48, 10]
Output3
The subarray [3, 8, 48] is nice: 3 & 8 = 0, 3 & 48 = 0, and 8 & 48 = 0. No longer nice subarray exists, so the answer is 3.

def longest_nice_subarray(nums):
    best = l = mask = 0
    for r, x in enumerate(nums):
        while mask & x:
            mask ^= nums[l]
            l += 1
        mask |= x
        best = max(best, r - l + 1)
    return best
function longestNiceSubarray(nums) {
  let best = 0, l = 0, mask = 0;
  for (let r = 0; r < nums.length; r++) {
    while (mask & nums[r]) {
      mask ^= nums[l];
      l++;
    }
    mask |= nums[r];
    best = Math.max(best, r - l + 1);
  }
  return best;
}
class Solution {
    public int longestNiceSubarray(int[] nums) {
        int best = 0, l = 0, mask = 0;
        for (int r = 0; r < nums.length; r++) {
            while ((mask & nums[r]) != 0) {
                mask ^= nums[l];
                l++;
            }
            mask |= nums[r];
            best = Math.max(best, r - l + 1);
        }
        return best;
    }
}
int longestNiceSubarray(vector<int>& nums) {
    int best = 0, l = 0, mask = 0;
    for (int r = 0; r < (int)nums.size(); r++) {
        while (mask & nums[r]) {
            mask ^= nums[l];
            l++;
        }
        mask |= nums[r];
        best = max(best, r - l + 1);
    }
    return best;
}
Time: O(n) Space: O(1)