个人练习-Leetcode-898. Bitwise ORs of Subarrays

该问题讨论了一种算法优化策略,通过位运算性质简化计算。初始尝试通过遍历所有子序列计算,但发现效率不足。解决方案是利用位运算的或操作会增加数值的特点,找到最大可能值并用剪枝策略减少不必要的计算,从而提高效率。
摘要由CSDN通过智能技术生成

题目链接:https://leetcode.cn/problems/bitwise-ors-of-subarrays/

题目大意:给出一个数列arr[],求【所有可能子列的】【所有元素做位运算或】的结果的个数。

思路:刚开始按子列的开始位置和子列长度遍历,len+1长度的子列的结果可以由len长度的子列和一个元素做位运算得到。原以为这样子节约了时间,后来想想好像还是把所有结果都算了一遍,时间过不了。

看了题解,注意到或|的位运算只会让非负整数【增大】,那么实际上最大的可能值就是arr[]所由元素做或运算。由于题目中arr[i] <= 1e9,那么上限实际上是可以确定的。在遍历时,如果某个子列已经达到上限,直接剪枝。

完整代码

class Solution {
public:
    int subarrayBitwiseORs(vector<int>& arr) {
        int N = arr.size();
        set<int> res;

        int MAXE = 0;
        for (int i = 0; i < N; i++)
            MAXE |= arr[i];
               
        for (int i = 0; i < N; i++) {
            int now = arr[i];
            res.insert(now);
            for (int j = i+1; j < N; j++) {
                now |= arr[j];
                res.insert(now);
                if (now == MAXE)
                    break;
            }
        }

        return res.size();
    }   
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值