文章目录
- 1. 题目
- 2. 解题
- 2.1 超时解
- 2.2 正解
1. 题目
我们有一个非负整数数组 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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 解题
2.1 超时解
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();}
};
2.2 正解
- 上面解法忽略了一个条件,| 操作 数字不会减小,当 区间
[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++
我的CSDN博客地址 https://michael.blog.csdn.net/
长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!