子序列的按位或 Bitwise ORs of Subarrays

2018-09-23 19:05:20

问题描述:

问题求解:

显然的是暴力的遍历所有的区间是不可取的,因为这样的时间复杂度为n^2级别的,对于规模在50000左右的输入会TLE。

然而,最后的解答也可以看作是一个暴力求解,也就是用Set来保存以当前数为结尾的左右可能解,在下一轮中遍历上一轮的所有解并进行或操作。

这里有个难以一下想到的地方就是,乍一看,这个时间复杂度依然是平方级别的,但是实际上,这里的时间复杂度是n级别的,因为Set中后一个数中的1完全覆盖前一个数,因此,最多只有不超过30个数在Set中,因此整个时间复杂度依然是线性的时间复杂度。

    public int subarrayBitwiseORs(int[] A) {
        Set<Integer> res = new HashSet<>();
        Set<Integer> cur = new HashSet<>();
        for (int i : A) {
            Set<Integer> tmp = new HashSet<>();
            tmp.add(i);
            for (Integer j : cur) tmp.add(i | j);
            res.addAll(tmp);
            cur = tmp;
        }
        return res.size();
    }

原文地址:https://www.cnblogs.com/TIMHY/p/9693491.html

时间: 2024-08-30 18:33:14

子序列的按位或 Bitwise ORs of Subarrays的相关文章

[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?re

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], ..., 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 re

【LeetCode】位运算 bit manipulation(共32题)

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica } [78]Subsets [136]Single Number [137]Single Number II [169]Majority Element [187]Repeated DNA Sequences [190]Reverse Bits [191]Number of 1 Bits [201]Bitwise AND of Numbers Range [231]Pow

unity, Rigidbody.constraints

一,同时施加多个限制: 用按位或(bitwise OR)实现,例如: GetComponent<Rigidbody>().constraints=RigidbodyConstraints.FreezeRotation                                      |RigidbodyConstraints.FreezePositionX |RigidbodyConstraints.FreezePositionZ; 二,去掉所有限制: GetComponent<

二十三、高级操作符

1. 概述 除了二.基本数据类型中所讲的运算符,Swift还有许多复杂的高级运算符,包括了C语和Objective-C中的位运算符和移位运算. 不同于C语言中的算术运算符 arithmetic operators ,Swift 的算术运算符默认是不可溢出的 overflow.溢出行为会被捕获并报告为错误.当然,如果你需要溢出的话,Swift也也提供了另一套默认允许溢出的算术操作符,如可溢出加 &+ .所有允许溢出的操作符都是以 & 开始的. 当你定义自己的类.结构体.枚举的时候,可以提供它

前端 crypto-js aes 加解密

https://www.jianshu.com/p/a47477e8126a crypto-js.js ;(function (root, factory) { if (typeof exports === "object") { // CommonJS module.exports = exports = factory(); } else if (typeof define === "function" && define.amd) { // A

&amp;与&amp;&amp;,|与||的区别

今天在做leetcode的时候,遇到了运算符的不同而导致结果不一致的问题.记录一下提醒自己 中文名称与英文名称 &:按位与(Bitwise and) &&:逻辑与(logical and) |:按位或(Bitwise or) ||:逻辑或(logical or) 区别 若第一个条件就可以决定表达式的值,逻辑运算符不会继续检查后续条件,而位运算符则会全部检查. 原文地址:https://www.cnblogs.com/cartooon/p/11290797.html

通过位运算来解决一些算法题

在刷pat的1073 多选题常见计分法题目时,发现如果需要判断每一个学生对应每道题的多选题是否错选,漏选,以及选对是比较麻烦的一件事,因为这涉及到两个集合的判断,判断一个集合是否是另一个集合的子集(即漏选,得一半的分),或者说两个集合是否完全相等(即题目得满分). 刚开始通过set容器来保存每一道题的正确答案,以及学生选择的答案,然后比较两个集合的大小,大小一致则for循环判断每一个元素是否都存在.结果发现这种思路过于复杂,且易超时. 联想到每一个选项是否一致,可以通过异或运算判断两个集合,如果

最长回文子序列

题目:给你一个字符串,求它的最长回文子序列,比如"bbbab" 最长回文子序列是"bbbb" 所以返回4,,"abab"最长子序列是"aba"或者"bab" 所以返回3 思路:和之前做的几道dp不同,,,也是我不够变通,,打dp表的时候总习惯左上到右下的顺序,但是这个顺序却固化了我的思维,忽略了对于题解本身含义的理解....... 这个题从下到上开始打表,最重要的是它的含义,,,知道dp[i][j]意味着什