前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >LeetCode 898. 子数组按位或操作(前缀和思想)

LeetCode 898. 子数组按位或操作(前缀和思想)

作者头像
Michael阿明
发布2021-02-19 14:45:16
发布2021-02-19 14:45:16
48200
代码可运行
举报
运行总次数:0
代码可运行

文章目录

1. 题目

我们有一个非负整数数组 A。

对于每个(连续的)子数组 B = [A[i], A[i+1], ..., A[j]] ( i <= j),我们对 B 中的每个元素进行按位或操作,获得结果 A[i] | A[i+1] | ... | A[j]

返回可能结果的数量。 (多次出现的结果在最终答案中仅计算一次。)

代码语言:javascript
代码运行次数:0
运行
复制
示例 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 超时解

代码语言:javascript
代码运行次数:0
运行
复制
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] 掩盖了
代码语言:javascript
代码运行次数:0
运行
复制
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++


本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/01/08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 1. 题目
  • 2. 解题
    • 2.1 超时解
    • 2.2 正解
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档