给你一个由 正 整数组成的数组 nums
。
如果 nums
的子数组中位于 不同 位置的每对元素按位 与(AND)运算的结果等于 0
,则称该子数组为 优雅 子数组。
返回 最长 的优雅子数组的长度。
子数组 是数组中的一个 连续 部分。
注意:长度为 1
的子数组始终视作优雅子数组。
示例 1:
输入:nums = [1,3,8,48,10] 输出:3 解释:最长的优雅子数组是 [3,8,48] 。子数组满足题目条件: - 3 AND 8 = 0 - 3 AND 48 = 0 - 8 AND 48 = 0 可以证明不存在更长的优雅子数组,所以返回 3 。
示例 2:
输入:nums = [3,1,5,11,13] 输出:1 解释:最长的优雅子数组长度为 1 ,任何长度为 1 的子数组都满足题目条件。
提示:
1 <= nums.length <= 105
1 <= nums[i] <= 109
方法一:滑动窗口
时间复杂度 nums
的长度。
class Solution:
def longestNiceSubarray(self, nums: List[int]) -> int:
ans = j = t = 0
for i, v in enumerate(nums):
while t & v:
t ^= nums[j]
j += 1
t |= v
ans = max(ans, i - j + 1)
return ans
class Solution {
public int longestNiceSubarray(int[] nums) {
int j = 0, t = 0;
int ans = 0;
for (int i = 0; i < nums.length; ++i) {
while ((t & nums[i]) != 0) {
t ^= nums[j++];
}
t |= nums[i];
ans = Math.max(ans, i - j + 1);
}
return ans;
}
}
class Solution {
public:
int longestNiceSubarray(vector<int>& nums) {
int t = 0, j = 0;
int ans = 0;
for (int i = 0; i < nums.size(); ++i) {
while (t & nums[i]) {
t ^= nums[j++];
}
t |= nums[i];
ans = max(ans, i - j + 1);
}
return ans;
}
};
func longestNiceSubarray(nums []int) int {
t, j := 0, 0
ans := 0
for i, v := range nums {
for (t & v) != 0 {
t ^= nums[j]
j++
}
t |= v
ans = max(ans, i-j+1)
}
return ans
}
func max(a, b int) int {
if a > b {
return a
}
return b
}