3097. 或值至少为 K 的最短子数组 II
思路:既然求的是区间,那么我们自然就想到前缀和、滑动窗口、双指针。
结合本题的特点:或运算,会发现如果一段连续的区间进行或运算,最多只会有32次运算可以改变,这是因为int型的二进制范围是-2 ^ 31 ~ 2^31-1,每次增加一个二进制形式的1。所以满足大于k的长度一定不超过35次。
这样我们自然就想到滑动窗口了。
我们先用一层for循环从左到右遍历每一个区间的右端点,然后第二层for循环去找到符合要求的最近的左端点。
和这道题一样的思路(nice!!!)LeetCode 2411. 按位或最大的最小子数组长度(数组、位运算)
class Solution {
public:
int minimumSubarrayLength(vector<int>& nums, int k) {
int n=nums.size();
vector<int> v(n,0);
int mn=1e9+10;
//遍历每一个区间的右端点
for(int i=0;i<n;i++){
//找到符合要求的最近的左端点
for(int j=i;j>=0;j--){
//如果插入i这个点,不能进行更新的话,自然j前面的点也无效。
if(j!=i&&(nums[i]|v[j])==v[j]) break;
//进行更新
v[j]=(nums[i]|v[j]);
//找到满足要求的点,直接就可以更新、退出了
if(v[j]>=k){
mn=min(i-j+1,mn);
break;
}
}
}
//注意都不符合的情况
return mn==1e9+10? -1:mn;
}
};
标签:运算,nums,int,mn,数组,II,短子,端点,nice
From: https://blog.csdn.net/weixin_46028214/article/details/139437269