当前位置: 首页 > news >正文

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

LeetCode 3878. 统计好子数组 的 Rust 实现如下:

```rust
impl Solution {
pub fn count_good_subarrays(nums: Vec<i32>) -> i64 {
let n = nums.len();
let mut l = vec![-1i32; n];
let mut stk: Vec<usize> = Vec::new();

for i in 0..n {
let x = nums[i];
while let Some(&top) = stk.last() {
if nums[top] < x && (nums[top] | x) == x {
stk.pop();
} else {
break;
}
}
l[i] = stk.last().map(|&v| v as i32).unwrap_or(-1);
stk.push(i);
}

let mut r = vec![n as i32; n];
stk.clear();

for i in (0..n).rev() {
while let Some(&top) = stk.last() {
if (nums[top] | nums[i]) == nums[i] {
stk.pop();
} else {
break;
}
}
r[i] = stk.last().map(|&v| v as i32).unwrap_or(n as i32);
stk.push(i);
}

let mut ans: i64 = 0;
for i in 0..n {
ans += (i as i64 - l[i] as i64) * (r[i] as i64 - i as i64);
}
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)`。

http://www.cnnetsun.cn/news/3984706.html

相关文章:

  • Ubuntu24.04双系统安装实操
  • 房产下行周期中的闲置资产破局之道:商业拍卖重要性凸显
  • 电脑本地 AI 自动化怎么玩,OpenClaw 从安装到执行任务(含安装包)
  • 建设学分银行网站策划书:打造终身学习数字枢纽的落地指南与深度解析
  • 增长放缓、估值较低,Dropbox为何成私募股权投资理想目标?
  • 揭秘乐清市住房和城乡建设规划局网站如何助力市民便捷办事与城市更新政策解读
  • Kimi LeetCode 3883. 统计满足数位和数组的非递减数组数目 Golang实现
  • 如何用wxlivespy构建企业级微信视频号直播数据监控系统
  • Steam游戏自动破解:如何快速实现离线游戏完整指南
  • Android SQLite数据库开发实战:从SQLiteOpenHelper到DAO模式完整指南
  • 网站建设与管理复习知识点:资深运维人揭秘网站全生命周期核心奥秘与避坑指南
  • 探索眉山建设中等职业技术学校网站:学子升学与就业的双重机遇指南,解读民办职业教育新标杆
  • 维普论文AI检测降重策略与语义重构技术详解
  • 当 human in the loop 变成“闭着眼睛点确认”,企业Agent 安全还能靠谁?
  • [光学原理与应用-500]:
  • 语言如何泄露思维模式:从词汇、句法到隐喻的认知分析
  • 多传感器融合SLAM:硬触发同步与RTK技术攻克长廊定位难题
  • Redis 不是万能存储:BigKey、消息可靠性与缓存一致性
  • 【2026最新】Python 安装教程(超详细图文版):从下载到安装一部到位
  • 计算机组成原理核心考点解析:Cache、流水线与复习策略
  • C++五子棋游戏开发:含禁手规则与AI实现详解
  • 网络爬虫技术深入探索——基于Python的实例解析与实战应用
  • 一个 NoSuchMethodError 查了 4 小时:双亲委派‘先问爹’的机制,让新 jar 永远赢不了老 jar
  • PCIe Gen6与EDSFF如何重塑数据中心存储架构
  • 从亚马逊得州天然气电厂事件,看AI算力狂潮下的绿色软件工程实践
  • 高性能macOS GUI应用架构解析:Applite如何实现Homebrew Casks的图形化管理
  • 适合企业行政做会议纪要整理的2026年5款会议总结工具测评
  • 自定义向量函数实现Qdrant批量数据向量化写入
  • 大文件分片上传与内容安全:从趣味体验到生产级解决方案
  • 红蓝对抗先写边界:允许动作、停止条件与报告路径