指尖划过的轨迹,藏着最细腻的答案~

题目:

给你一个长度为 n 的整数数组 nums 。

考虑 nums 中进行 按位与(bitwise AND)运算得到的值 最大 的 非空 子数组。

换句话说,令 k 是 nums 任意 子数组执行按位与运算所能得到的最大值。那么,只需要考虑那些执行一次按位与运算后等于 k 的子数组。 返回满足要求的 最长 子数组的长度。

数组的按位与就是对数组中的所有数字进行按位与运算。

子数组 是数组中的一个连续元素序列。

<br>

示例 1:

输入:nums = [1,2,3,3,2,2] 输出:2 解释: 子数组按位与运算的最大值是 3 。 能得到此结果的最长子数组是 [3,3],所以返回 2 。

示例 2:

输入:nums = [1,2,3,4] 输出:1 解释: 子数组按位与运算的最大值是 4 。 能得到此结果的最长子数组是 [4],所以返回 1 。

提示:

1 <= nums.length <= 10^5 1 <= nums[i] <= 10^6

分析:

AND(&)运算的性质是,参与 AND 运算的元素越多,AND 结果越小(不会变得更大)。 所以我们通过 AND 运算能得到的最大值,就是 nums 的最大值 mx。

多个相同 mx 计算 AND,结果仍然是 mx;而 mx 与另一个小于 mx 的数计算 AND,结果会小于 mx。所以问题变成:

  • 计算 nums 的最长连续子数组的长度,该子数组只包含 mx。

AC代码:

class Solution {
public:int longestSubarray(vector<int>& nums) {int maxn = ranges::max(nums);int ans = 0, cnt = 0;for (int i = 0; i < nums.size(); i++) {if (nums[i] == maxn) {cnt++;ans = max(ans, cnt);} else {cnt = 0;}}return ans;}
};