我们有一个非负整数数组 A。
对于每个(连续的)子数组 B = [A[i], A[i+1], ..., A[j]] ( i <= j)
,我们对 B 中的每个元素进行按位或操作,获得结果 A[i] | A[i+1] | ... | A[j]
。
返回可能结果的数量。 (多次出现的结果在最终答案中仅计算一次。)
示例 1:
输入:[0]
输出:1
解释:
只有一个可能的结果 0 。
示例 2:
输入:[1,1,2]
输出:3
解释:
可能的子数组为 [1],[1],[2],[1, 1],[1, 2],[1, 1, 2]。
产生的结果为 1,1,2,1,3,3 。
有三个唯一值,所以答案是 3 。
示例 3:
输入:[1,2,4]
输出:6
解释:
可能的结果是 1,2,3,4,6,以及 7 。
提示:
1 <= A.length <= 50000
0 <= A[i] <= 10^9
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/bitwise-ors-of-subarrays 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution { // 超时
public:
int subarrayBitwiseORs(vector<int>& arr) {
int n = arr.size();
unordered_set<int> a, b, ans;
for(int i = 0; i < n; ++i)
{
b.clear();
b.insert(arr[i]);
for(auto it = a.begin(); it != a.end(); ++it)
{
b.insert(*it|arr[i]);
}
a.swap(b);
for(auto i : a)
ans.insert(i);
}
return ans.size();
}
};
[j, i]
| 操作的结果 == [j, i-1]
的结果,那么 [j-1, i]
,[j-2, i]
等往前的都不需要计算了,都是一样的结果,A[i] 的贡献 被 区间 [j, i-1]
掩盖了class Solution {
public:
int subarrayBitwiseORs(vector<int>& arr) {
int n = arr.size();
unordered_set<int> ans;
for(int i = 0; i < n; ++i)//以 i 为右端点
{
ans.insert(arr[i]);
for(int j = i-1; j >= 0; --j) // j 为左端点
{
if((arr[j]|arr[i])==arr[j])
break;//arr[j] 存储的是 [j, i-1] 的区间 | 和
arr[j] |= arr[i]; //现在 arr[j] 存储的是 [j, i] 的区间 | 和
ans.insert(arr[j]);
}
}
return ans.size();
}
};
1008 ms 95.7 MB C++