ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

LeetCode 2401.最长优雅子数组

2026/8/13 9:55:06 拓冰建站 浏览量
LeetCode 2401.最长优雅子数组

给你一个由 正 整数组成的数组 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^55
1 <= nums[i] <= 109^99

滑动窗口,保证窗口内是优雅子数组即可:

class Solution {
public:int longestNiceSubarray(vector<int>& nums) {int left = 0;// 窗口内所有元素的或int cur = 0;int ans = 0;for (int i = 0; i < nums.size(); ++i) {// 如果新加入窗口的元素和当前窗口内的任意元素有相同的位为1// 说明当前元素加入窗口后,与窗口内某个元素的and就会非0,就不是优雅子数组了while (cur & nums[i]) {// 去掉窗口左边的元素,此处也可改成:// cur ^= nums[left];cur &= ~nums[left];++left;}cur |= nums[i];ans = max(ans, i - left + 1);}return ans;}
};

如果nums的长度为n,则此算法时间复杂度为O(n),空间复杂度为O(1)。