Problem: 2419. 按位与最大的最长子数组
思路
子数组按位与的结果,不会超过子数组里的最大值(因为 a & b ≤ max(a, b))。 进一步推导,整个数组最大按位与的结果就是数组本身的最大值。 因为最大的那个元素自己作为子数组时,按位与结果就是它自己,其他子数组的按位与结果不可能超过它 。
解题过程
- 找到数组的最大值 max_and(这是 "按位与结果最大" 的目标值 )。
- 找到连续等于 max_and 的最长子数组长度 (因为只有这些子数组的按位与结果会等于 max_and,其他子数组的按位与结果必然更小 )。
复杂度
- 时间复杂度: O(n)
- 空间复杂度: O(1)
cpp
class Solution {
public:
int longestSubarray(vector<int>& nums) {
int maxval = *max_element(nums.begin(), nums.end());
int ans = 0;
int cur_len = 0;
for (int i = 0; i < nums.size(); i++) {
if (nums[i] == maxval) {
cur_len++;
ans = max(ans, cur_len);
} else {
cur_len = 0;
}
}
return ans;
}
};