滑动窗口,但是此题是不满足条件时右侧扩展(而非左侧收缩)
//来自TsReaper
const int MAXN = 30;
bool check(int *cnt)
{
for(int i = 0; i < MAXN; i++)
{
if(cnt[i] > 1) return false;
}
return true;
}
int longestNiceSubarray(vector<int>& nums)
{
int n = nums.size();
int ans = 0;
int cnt[35] = {0};
for(int i = 0, j = 0; i < n; i++)
{
for(int k = 0; k < MAXN; k++) cnt[k] += (nums[i] >> k) & 1;
while(j <= i && !check(cnt))
{
for(int k = 0; k < MAXN; k++) cnt[k] -= (nums[j] >> k) & 1;
j++;
}
ans = max(ans, i - j + 1);
}
return ans;
}