十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Kimi LeetCode 3878. 统计好子数组 JavaScript实现

Kimi    LeetCode 3878. 统计好子数组 JavaScript实现 LeetCode 3878. 统计好子数组 的 JavaScript 实现如下javascript/*** param {number[]} nums* return {number}*/var countGoodSubarrays function(nums) {const n nums.length;const l new Array(n).fill(-1);const stk [];for (let i 0; i n; i) {const x nums[i];while (stk.length 0 nums[stk[stk.length - 1]] x (nums[stk[stk.length - 1]] | x) x) {stk.pop();}l[i] stk.length 0 ? stk[stk.length - 1] : -1;stk.push(i);}const r new Array(n).fill(n);stk.length 0;for (let i n - 1; i 0; i--) {while (stk.length 0 (nums[stk[stk.length - 1]] | nums[i]) nums[i]) {stk.pop();}r[i] stk.length 0 ? stk[stk.length - 1] : n;stk.push(i);}let ans 0;for (let i 0; i n; i) {ans (i - l[i]) * (r[i] - i);}return ans;};思路说明这道题的核心思路是 单调栈 枚举贡献题目定义一个子数组是好的当且仅当该子数组所有元素的 按位或bitwise OR 结果等于子数组中 至少出现一次 的元素。关键观察对于每个元素 nums[i]如果它是某个子数组的按位或结果那么该子数组中所有元素都必须是 nums[i] 的位运算子集即满足 nums[k] | nums[i] nums[i]。算法步骤1. 找左边界 l[i]从左到右遍历用单调栈维护下标。对于 nums[i]弹出所有满足 nums[stk[-1]] x 且 nums[stk[-1]] | x x 的元素即被 x 包含的较小元素。l[i] 就是栈顶元素最后一个不满足条件的元素。2. 找右边界 r[i]从右到左遍历用单调栈维护下标。对于 nums[i]弹出所有满足 nums[stk[-1]] | nums[i] nums[i] 的元素即被 nums[i] 包含的元素。r[i] 就是栈顶元素第一个不满足条件的元素。3. 计算贡献以 nums[i] 为按位或结果的子数组数量为 (i - l[i]) * (r[i] - i)。时间复杂度 O(n)空间复杂度 O(n)。
返回列表