leetcode - 898. 子数组按位或操作(使用了集合)
我们有一个非负整数数组 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. 子数组按位或操作(使用了集合)相关推荐
- LeetCode 898. 子数组按位或操作(前缀和思想)
文章目录 1. 题目 2. 解题 2.1 超时解 2.2 正解 1. 题目 我们有一个非负整数数组 A. 对于每个(连续的)子数组 B = [A[i], A[i+1], ..., A[j]] ( i ...
- 898. 子数组按位或操作
题目 题解 本题是按动态规划来解的 cur :集合.保存的是当前遍历的元素与上一轮cur或的结果+ 当前的元素的集合 ans: 集合.目前所有元素或的结果 整理的就是所有元素的排列组合 class S ...
- leetcode算法题--子数组按位或操作
原题链接:https://leetcode-cn.com/problems/bitwise-ors-of-subarrays/ 动态规划 dp[i]表示A[:i]的所有子数组按位或的结果 状态转移 d ...
- LeetCode 1856. 子数组最小乘积的最大值(前缀和 + 单调栈)
文章目录 1. 题目 2. 解题 1. 题目 一个数组的 最小乘积 定义为这个数组中 最小值 乘以 数组的 和 . 比方说,数组 [3,2,5] (最小值是 2)的最小乘积为 2 * (3+2+5) ...
- LeetCode 2104. 子数组范围和(单调栈)
文章目录 1. 题目 2. 解题 1. 题目 给你一个整数数组 nums .nums 中,子数组的 范围 是子数组中最大元素和最小元素的差值. 返回 nums 中 所有 子数组范围的 和 . 子数组是 ...
- LeetCode 907. 子数组的最小值之和(单调栈)
文章目录 1. 题目 2. 解题 1. 题目 给定一个整数数组 A,找到 min(B) 的总和,其中 B 的范围为 A 的每个(连续)子数组. 由于答案可能很大,因此返回答案模 10^9 + 7. 示 ...
- LeetCode - 644 子数组最大平均数 II
目录 题目来源 题目描述 示例 提示 题目解析 算法源码 题目来源 644. 子数组最大平均数 II - 力扣(LeetCode) 题目描述 给定一个包含 n 个整数的数组nums,找到最大平均值的连 ...
- LeetCode 区间子数组个数
给定一个元素都是正整数的数组A ,正整数 L 以及 R (L <= R). 求连续.非空且其中最大元素满足大于等于L 小于等于R的子数组个数. 例如 : 输入: A = [2, 1, 4, 3] ...
- 【Leetcode数组--子数组--滑动窗口】209. 长度最小的子数组 904. 水果成篮 1004. 最大连续1的个数 III 76. 最小覆盖子串(有数组操作中重要的方法:滑动窗口!!!!)
文章目录 Leetcode209 1.问题描述 2.解决方案 解法一:两个错误思路的算法 解法二:暴力 解法三:滑动窗口法(O(n)) Leetcode904 1.问题描述 2.解决方案 Leetco ...
最新文章
- fancybox 在打开窗口前 先执行 js脚本,fancybox设置只能通过右上角关闭,fancybox遮罩层关闭...
- iView:一套基于Vue的高质量UI组件库
- 网络营销外包——网络营销外包前关键词排名反超首页的原因在哪里
- RabbitMQ自学之路(九)——RabbitMQ实现延时队列的两种方式
- 大数据量生成工具源代码(Delphi)
- 工商银行信用卡如何通过刷星提额?
- html5大赛是什么,IE9开发大赛为HTML5打了一针兴奋剂
- win7 IE11卸载后无法上网
- 消息中间件学习总结(1)——RocketMQ之专访RocketMQ联合创始人:项目思路、技术细节和未来规划
- java电子书下载网站
- Oracle:PL/SQL程序开发
- Dw cs6的详细下载安装教程对网页设计需要cs6的同学
- 软件测试——测试分类及测试工具的简介
- 合抱之木,生于毫末; 九层之台,起于垒土。
- 学生用计算机中括号怎么打,大括号怎么打,教您word大括号怎么输入
- sudo与su的区别
- js之清除Cookie
- matlab输出数据为excel文件
- 内部泄露版!互联网大厂的薪资和职级一览
- OpenGL ES for Android 绘制旋转的地球