[LeetCode] 898. Bitwise ORs of Subarrays 子数组按位或操作
We have an array `A` of non-negative integers.
For every (contiguous) subarray B = [A[i], A[i+1], ..., A[j]] (with i <= j), we take the bitwise OR of all the elements in B, obtaining a result A[i] | A[i+1] | ... | A[j].
Return the number of possible results. (Results that occur more than once are only counted once in the final answer.)
Example 1:
Input: [0]
Output: 1
Explanation:
There is only one possible result: 0.
Example 2:
Input: [1,1,2]
Output: 3
Explanation:
The possible subarrays are [1], [1], [2], [1, 1], [1, 2], [1, 1, 2].
These yield the results 1, 1, 2, 1, 3, 3.
There are 3 unique values, so the answer is 3.
Example 3:
Input: [1,2,4]
Output: 6
Explanation:
The possible results are 1, 2, 3, 4, 6, and 7.
Note:
1 <= A.length <= 500000 <= A[i] <= 10^9
这是一道蛮有意思的题目,说是给了我们一个数组,里面都是非负数,问我们所有连续的子数组'或'起来能产生多少个不同的值。虽说这只是一道 Medium 的题,但是直觉告诉博主,暴力遍历所有子数组,并且一个一个的'或'将会产生大量的重复运算,不出意外应该是会 TLE 的。所以博主的第一直觉是能不能建立类似累加和一样的数组,然后快速计算任意区间的总'或'值,尝试了一下,虽然可以建立累加'或'数组,但是无法得到正确的区间总'或'值,博主甚至尝试了'异或',仍然不对,只得作罢。其实这道题的正确解法还是蛮巧妙的,感觉不容易一下子想到,这里主要参考了 [网上大神 zhoubowei 的帖子](https://leetcode.com/problems/bitwise-ors-of-subarrays/discuss/165859/C%2B%2B-O(kN)-solution),举个例子吧,比如数组 [0, 3, 4, 6, 5],写成二进制的就是 [001, 011, 100, 110, 101],生成子数组的方法跟生成子集合 [Subsets](http://www.cnblogs.com/grandyang/p/4309345.html) 有些类似,但由于子数组必须是连续的,所以个数比子集合要少一些,生成的方法也是在现有的集合都加入当前数字,并每次新加一个只有当前数字的集合,顺序如下:
[001]
[001 011] [011]
[001 011 100] [011 100] [100]
[001 011 100 110] [011 100 110] [100 110] [110]
[001 011 100 110 101] [011 100 110 101] [100 110 101] [110 101] [101]
我们可以看到,最开始就只有一个集合 [001],然后对于数字 011,先放到现有集合中,变成 [001 011],然后再新建一个自己的集合 [011],对于后面的数字都是同样的操作,最后我们就有5个不同的集合,代表了所有的子数组,我们对每个集合都计算总'或'值,可以得到:
001
011 011
111 111 100
111 111 110 110
111 111 111 111 101
之前提到了,若对于每个集合都一个一个的'或'起来,将会十分的不高效,而其实这里面可能会有许多重复值,所以对重复值只需要保留一个,实际上就可以变成:
001
011
111 100
111 110
111 101
这样数字就减少了很多,使得计算效率也就大大的提高了。具体的做法是,开始先建立两个 HashSet,分别是 res 和 cur,然后遍历数组A,对于每个遍历到的数字,首先生成一个自己的集合 tmp,然后遍历集合 cur 中的所有数字,将当前数字和 cur 中的每个数字相'或',并存入 tmp 中,由于 HashSet 可以自动去重复,所以 tmp 中保存的只有不同的值,然后将 tmp 全部赋值给 cur,再将 cur 中的所有值加入结果 res 中,由于结果 res 也是 HashSet,也可以自动去重复,最后留在 res 中的就是所有不同的子数组的总'或'值,参见代码如下:
class Solution {
public:
int subarrayBitwiseORs(vector<int>& A) {
unordered_set<int> res, cur;
for (int i : A) {
unordered_set<int> tmp = {i};
for (int j : cur) tmp.insert(i | j);
cur = tmp;
for (int j : cur) res.insert(j);
}
return res.size();
}
};
Github 同步地址:
https://github.com/grandyang/leetcode/issues/898
参考资料:
https://leetcode.com/problems/bitwise-ors-of-subarrays/
https://leetcode.com/problems/bitwise-ors-of-subarrays/discuss/165859/C%2B%2B-O(kN)-solution
https://leetcode.com/problems/bitwise-ors-of-subarrays/discuss/165881/C%2B%2BJavaPython-O(30N)
[LeetCode All in One 题目讲解汇总(持续更新中...)](https://www.cnblogs.com/grandyang/p/4606334.html)
[LeetCode] 898. Bitwise ORs of Subarrays 子数组按位或操作的更多相关文章
- [Swift]LeetCode898. 子数组按位或操作 | Bitwise ORs of Subarrays
We have an array A of non-negative integers. For every (contiguous) subarray B = [A[i], A[i+1], ..., ...
- 【LeetCode】898. Bitwise ORs of Subarrays 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 动态规划 相似题目 参考资料 日期 题目地址:htt ...
- 898. Bitwise ORs of Subarrays
We have an array A of non-negative integers. For every (contiguous) subarray B = [A[i], A[i+1], ..., ...
- LC 898. Bitwise ORs of Subarrays
We have an array A of non-negative integers. For every (contiguous) subarray B = [A[i], A[i+1], ..., ...
- [LeetCode] Subarray Product Less Than K 子数组乘积小于K
Your are given an array of positive integers nums. Count and print the number of (contiguous) subarr ...
- [LeetCode] 907. Sum of Subarray Minimums 子数组最小值之和
Given an array of integers A, find the sum of min(B), where B ranges over every (contiguous) subarra ...
- [LeetCode] 560. Subarray Sum Equals K 子数组和为K
Given an array of integers and an integer k, you need to find the total number of continuous subarra ...
- [LeetCode] Minimum Size Subarray Sum 最短子数组之和
Given an array of n positive integers and a positive integer s, find the minimal length of a subarra ...
- [LeetCode] Continuous Subarray Sum 连续的子数组之和
Given a list of non-negative numbers and a target integer k, write a function to check if the array ...
随机推荐
- 发布.net core项目 System.AggregateException: 发生一个或多个错误
背景:之前创建.net core webapi项目的时候SDK是2.2的版本,后改成2.1,发布的时候报错. 发布的时候报错,展示的信息是: 其实这里也大致能看到部分信息,但由于信息量太小,没办法知道 ...
- WPF Xaml中创建集合
首先在xaml中创建集合是一个不可取的方法. 本方法仅作为xaml的学习. 本文略微无聊,主要是编写的东西都是老玩意. 首先是定义一个类,作为你要加载集合的模型. 结构如下 internal clas ...
- WPF ItemsSource Order by Getter
public ObservableCollection<CustomerModel> CustomerCollection { get { if(customerCollection!=n ...
- 接口interface实现与显示实现
接口实现: interface IMath { void Add(int x, int y); } public class MathClass : IMath { public void Add(i ...
- PHP 类/对象函数
PHP类/对象函数是PHP核心的一部分,无需要安装就可以使用. 函数名称 描述 __autoload 尝试加载未定义的类 class_alias 为一个类创建别名 class_exists 检查类是否 ...
- 学习shiro第一天
shiro是一个强大而且易用的安全框架(主要包括认证和授权),它比spring security更加简单,而且它不依赖于任何容器,可以和许多框架集成. shiro的核心是安全管理器(SecurityM ...
- 腾讯WeTest兼容服务再次升级,支持小程序兼容
WeTest 导读 小程序作为微信内能被便捷地获取和传播的工具,吸引着越来越多的开发者加入其中.无论是小游戏.零售.出行服务还是生活餐饮等,各行各业的小程序出现在用户的手机上,在给用户带来便利的同时, ...
- npm和cnpm命令后无响应
问题: 1.把前端环境配制完毕之后,打开项目,输入cnpm install之后,光标一直在另起一行的位置闪,但是丝毫没有在安装的迹象. 2.打开cmd,在窗体中输入node -v 可以显示版本,但是输 ...
- 【Qt编程】基于QWT的曲线绘制及图例显示操作——有样点的实现功能
在<QWT在QtCreator中的安装与使用>一文中,我们完成了QWT的安装,这篇文章我们讲讲基础曲线的绘制功能. 首先,我们新建一个Qt应用程序,然后一路默认即可.这时,你会发现总共有: ...
- iframe超出外层元素显示滚动条怎么办?
尝试把外层盒子滚动条样式隐藏,或者设为overflow:hidden等都不生效,突然发现iframe有这个属性的忘记用了!! <iframe frameborder="0" ...