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

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/bitwise-ors-of-subarrays
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
————————————
解题思路:使用动态规划,一直超时真是头皮发麻;

设dp[i][j]dp[i][j]dp[i][j]表示从非负数组A[i]A[i]A[i]到A[j]A[j]A[j]的子数组进行或操作之后得到的值。

对于dp[i][j+1]dp[i][j+1]dp[i][j+1],该子数组使用动态规划求解其或操作之后得到的值,其动态转移方程为:

dp[i][j+1]=dp[i][j]∣A[j+1]dp[i][j+1]=dp[i][j] | A[j+1]dp[i][j+1]=dp[i][j]∣A[j+1]

因为动态转移方程只用到上一个状态的信息,因此只需要一维数组就能存储所有的信息;

其C++代码如下:

class Solution {public:int subarrayBitwiseORs(vector<int>& a) {int length = a.size();unordered_set<unsigned int> nums;   #建立一个集合,集合中不会有重复的数字int max = 0;for(int i=0;i<length;i++)  #找出最大值,用于作为停止条件,避免更多的重复操作{max |=a[i];}nums.insert(max);  #最大值必定在子数组或操作中出现,因此存进集合里for(int i=0;i<length;i++){int bitee = a[i];   #以数组中的每一个数字作为循环的开始nums.insert(bitee);for(int j=i+1;j<length;j++){bitee = bitee|a[j];  #状态转移方程,进行或操作if(bitee==max)  #如果达到最大值。避免浪费时间,直接breakbreak;if(bitee>a[j])  #如果这一次的或操作得到的值没有增加,则可以跳过nums.insert(bitee);}}return nums.size();  #返回集合里面不同数字的数量}
};

leetcode - 898. 子数组按位或操作(使用了集合)相关推荐

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

    文章目录 1. 题目 2. 解题 2.1 超时解 2.2 正解 1. 题目 我们有一个非负整数数组 A. 对于每个(连续的)子数组 B = [A[i], A[i+1], ..., A[j]] ( i ...

  2. 898. 子数组按位或操作

    题目 题解 本题是按动态规划来解的 cur :集合.保存的是当前遍历的元素与上一轮cur或的结果+ 当前的元素的集合 ans: 集合.目前所有元素或的结果 整理的就是所有元素的排列组合 class S ...

  3. leetcode算法题--子数组按位或操作

    原题链接:https://leetcode-cn.com/problems/bitwise-ors-of-subarrays/ 动态规划 dp[i]表示A[:i]的所有子数组按位或的结果 状态转移 d ...

  4. LeetCode 1856. 子数组最小乘积的最大值(前缀和 + 单调栈)

    文章目录 1. 题目 2. 解题 1. 题目 一个数组的 最小乘积 定义为这个数组中 最小值 乘以 数组的 和 . 比方说,数组 [3,2,5] (最小值是 2)的最小乘积为 2 * (3+2+5) ...

  5. LeetCode 2104. 子数组范围和(单调栈)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个整数数组 nums .nums 中,子数组的 范围 是子数组中最大元素和最小元素的差值. 返回 nums 中 所有 子数组范围的 和 . 子数组是 ...

  6. LeetCode 907. 子数组的最小值之和(单调栈)

    文章目录 1. 题目 2. 解题 1. 题目 给定一个整数数组 A,找到 min(B) 的总和,其中 B 的范围为 A 的每个(连续)子数组. 由于答案可能很大,因此返回答案模 10^9 + 7. 示 ...

  7. LeetCode - 644 子数组最大平均数 II

    目录 题目来源 题目描述 示例 提示 题目解析 算法源码 题目来源 644. 子数组最大平均数 II - 力扣(LeetCode) 题目描述 给定一个包含 n 个整数的数组nums,找到最大平均值的连 ...

  8. LeetCode 区间子数组个数

    给定一个元素都是正整数的数组A ,正整数 L 以及 R (L <= R). 求连续.非空且其中最大元素满足大于等于L 小于等于R的子数组个数. 例如 : 输入: A = [2, 1, 4, 3] ...

  9. 【Leetcode数组--子数组--滑动窗口】209. 长度最小的子数组 904. 水果成篮 1004. 最大连续1的个数 III 76. 最小覆盖子串(有数组操作中重要的方法:滑动窗口!!!!)

    文章目录 Leetcode209 1.问题描述 2.解决方案 解法一:两个错误思路的算法 解法二:暴力 解法三:滑动窗口法(O(n)) Leetcode904 1.问题描述 2.解决方案 Leetco ...

最新文章

  1. fancybox 在打开窗口前 先执行 js脚本,fancybox设置只能通过右上角关闭,fancybox遮罩层关闭...
  2. iView:一套基于Vue的高质量UI组件库
  3. 网络营销外包——网络营销外包前关键词排名反超首页的原因在哪里
  4. RabbitMQ自学之路(九)——RabbitMQ实现延时队列的两种方式
  5. 大数据量生成工具源代码(Delphi)
  6. 工商银行信用卡如何通过刷星提额?
  7. html5大赛是什么,IE9开发大赛为HTML5打了一针兴奋剂
  8. win7 IE11卸载后无法上网
  9. 消息中间件学习总结(1)——RocketMQ之专访RocketMQ联合创始人:项目思路、技术细节和未来规划
  10. java电子书下载网站
  11. Oracle:PL/SQL程序开发
  12. Dw cs6的详细下载安装教程对网页设计需要cs6的同学
  13. 软件测试——测试分类及测试工具的简介
  14. 合抱之木,生于毫末; 九层之台,起于垒土。
  15. 学生用计算机中括号怎么打,大括号怎么打,教您word大括号怎么输入
  16. sudo与su的区别
  17. js之清除Cookie
  18. matlab输出数据为excel文件
  19. 内部泄露版!互联网大厂的薪资和职级一览
  20. OpenGL ES for Android 绘制旋转的地球

热门文章

  1. 如何创建自定义性能计数器
  2. Android的Dalvik虚拟机的一个小BUG
  3. 远离ARP*** ARP防火墙新版发布
  4. Nginx 其他模块
  5. jdk并发包里常用的类
  6. 虚拟技术必须解决的问题_VR/3D虚拟实验室亮相重庆市初中物理青年教师优质课大赛...
  7. mysql索引的增删_mysql索引的增删改查怎么实现?
  8. PHP 代码简洁之道 ( PHP Clean Code)(第二部分)
  9. 【Nginx那些事】Nginx 配置文件说明
  10. 【JS】JavaScript复制内容到剪贴板