楼主:
oin1104 (是oin的说)
2025-03-19 00:16:50※ 引述 《Rushia (早瀬ユウカの体操服)》 之铭言:
:
: https://leetcode.com/problems/longest-nice-subarray
: 2401. Longest Nice Subarray
: 给你一个阵列nums,如果他的子阵列的任意两个元素and后为0则他是一个nice阵列,求出
: 最长的nice阵列有多长(长度为1的阵列总是nice)。
:
: 思路:
: 双指针,如果当前加入的元素跟之前加入的bit位置都没重复就可以加入长度加一,否则
: 一直pop前面的数字(用xor删掉前面加过的元素),返回最长长度即可。
:
思路:
之前每日有一个类似的题目
好像是找abc不重复的字串
那题就是要看上一个目标字母最后出现的地方
如果用这种思路的话
就是看上一个bit出现的地方
但是有两种可能
一种是这个bit是0
那就可以找上上个bit的下一个
一种是这个bit是1
那就是找上个bit的下一个
这样复杂度应该一样是n
但是是32n
0.0
```cpp
class Solution {
public:
int longestNiceSubarray(vector<int>& nums)
{
int n = nums.size();
vector<bitset<32>> paper(n);
vector<vector<int>> last_bit(32);
int res = 0;
for(int i = 0 ; i < n ; i ++)
{
int num = nums[i];
int last = 0;
for(int b = 0 ; b < 31 ; b ++)
{
int bit = pow(2,b);
if(num & bit)
{
if(last_bit[b].size() > 0)last = max(last_bit[b].back()+1 ,
last);
last_bit[b].push_back(i);
// cout << 1 << "";
}
else
{
if(last_bit[b].size() > 1)last = max(last_bit[b][last_bit[b]
.size()-2]+1 , last);
// cout << 0 << "";
}
}
// cout << endl;
// cout << i << " " << last << endl;
res = max(res , i-last+1);
}
return res;
}
};
```