給你一個由 正 整數組成的數組 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)。