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

Kimi LeetCode 3621. 位计数深度为 K 的整数数目 I Rust实现

LeetCode 3621. 位计数深度为 K 的整数数目 I Rust 实现

```rust
impl Solution {
pub fn popcount_depth(n: i64, k: i32) -> i64 {
// k=0:只有 1 的深度为 0
if k == 0 {
return if n >= 1 { 1 } else { 0 };
}

// 计算一个整数的 popcount
fn pc(mut x: i32) -> i32 {
let mut cnt = 0;
while x > 0 {
cnt += x & 1;
x >>= 1;
}
cnt
}

// 预处理 1~60 的 popcount-depth
let mut depth = vec![-1; 65];
depth[1] = 0;

fn get_depth(x: i32, depth: &mut Vec<i32>) -> i32 {
if x == 1 {
return 0;
}
if depth[x as usize] != -1 {
return depth[x as usize];
}
let d = 1 + get_depth(pc(x), depth);
depth[x as usize] = d;
d
}

// 找出所有满足 depth(c) == k-1 的 popcount 值 c
let mut targets = vec![];
for i in 1..=60 {
if get_depth(i, &mut depth) == k - 1 {
targets.push(i);
}
}

if targets.is_empty() {
return 0;
}

// n 的二进制表示,按位存储
let bits: Vec<u8> = format!("{:b}", n).bytes().map(|b| b - b'0').collect();
let m = bits.len();
let mut ans = 0i64;

for &c in &targets {
// memo[pos][ones],仅非 tight 状态有效,-1 表示未计算
let mut memo = vec![vec![-1i64; (c + 1) as usize]; m];

fn dfs(
pos: usize,
ones: i32,
tight: bool,
bits: &Vec<u8>,
c: i32,
memo: &mut Vec<Vec<i64>>,
) -> i64 {
if ones > c {
return 0; // 1 的个数已超,剪枝
}
if pos == bits.len() {
return if ones == c { 1 } else { 0 };
}

if !tight && memo[pos][ones as usize] != -1 {
return memo[pos][ones as usize];
}

let limit = if tight { bits[pos] } else { 1 };
let mut res = 0i64;

for d in 0..=limit {
res += dfs(
pos + 1,
ones + d as i32,
tight && (d == limit),
bits,
c,
memo,
);
}

if !tight {
memo[pos][ones as usize] = res;
}
res
}

ans += dfs(0, 0, true, &bits, c, &mut memo);
}

// k=1 的特殊处理:popcount=1 包含 x=1,但 depth(1)=0,需排除
if k == 1 {
ans -= 1;
}

ans
}
}
```

---

Rust 实现要点

要点 说明
`format!("{:b}", n)` 将 `n` 转为二进制字符串,再拆分为 `Vec<u8>` 逐位处理
内部递归函数 `dfs` 作为独立函数接收所有必要参数(闭包递归在 Rust 中较繁琐)
记忆化数组 `memo[pos][ones]` 用 `-1` 标记未计算,仅 `tight = false` 时写入复用
`i64` 返回值 `n ≤ 10¹⁵`,答案在 `i64` 范围内;`pc` 用 `i32` 即可(`x ≤ 60`)
k=1 修正 `c = 1` 时会把 `x = 1` 算入,但其深度为 0,需减去

时间复杂度: `O(log² n)`

空间复杂度: `O(log² n)`

http://www.jsqmd.com/news/1216478/

相关文章:

  • 杭州爱彼回收价格查询和靠谱回收平台实测排行(2026年7月最新) - 嘉价奢侈品回收平台
  • 浏览器一次请求到底经历了什么?
  • 有生产扩能需求 洗瓶灌装一体化设备厂怎么联系才靠谱 - 热点品牌推荐
  • 2026年7月最新杭州积家官方售后服务热线与网点地址查询 - 积家官方售后服务中心
  • 嵌入式DMM中断机制:从原理到实战的错误处理与配置指南
  • U-Boot 核心配置——printenv / setenv / saveenv 环境变量操作
  • 2026济南汽车租赁哪家靠谱 主流合规服务商综合推荐 - 奔跑123
  • 上海宝珀回收价格查询与各大回收平台实测排行(2026年7月最新) - 嘉价奢侈品回收平台
  • 宝玑官方服务项目及价格查询|热线和完整维修地址权威信息公告(2026年7月最新) - 亨得利钟表维修中心
  • 上海16区黄金回收靠谱推荐|嘟嘟芮深耕多年老店,零套路口碑认证No.1 - 沪上贵金属口碑推荐官
  • 2026年北京全域正规汽车电路检修公司联系方式汇总 - 热点品牌推荐
  • ngx_output_chain_as_is
  • 天梭中国官方售后服务中心|电话和完整地址权威信息通知(2026年7月更新) - 天梭服务中心
  • 2026河北PU/PIR夹芯板生产线主流厂商名录盘点 - 奔跑123
  • 如何设置VirtualBox的最大分辨率
  • 2026年郑州老旧卫生间重做防水公司实用选择指南 - 热点品牌推荐
  • 湖北气泡膜包装袋公司选型要点及合作实用参考指南 - 热点品牌推荐
  • 国内主流喷雾干燥设备厂家综合实力排行盘点 - 奔跑123
  • 2026年7月最新亨得利官方服务项目及价格查询|地址及客服热线权威信息通告 - 亨得利官方博客
  • 3分钟快速上手DeepL Chrome翻译插件:告别复制粘贴的终极解决方案
  • 2026年工业同步带多场景实际应用性能综合评测 - 奔跑123
  • Wayca-scheduler代码实现原理:深入解析硬件拓扑发现算法
  • 2026 年新消息:花都正规的展台设计搭建工作室哪家专业,别再瞎花钱!高转化展台的秘密布局曝光 - 行业推荐官[官方】--
  • 2026年襄阳及鄂西北找质量好的小康配件店铺哪家强 - 热点品牌推荐
  • 【AI问数】五引擎混合查询架构:突破NL2SQL的场景局限
  • 找靠谱宁波钣金折弯源头厂家 实用选型参考指南 - 热点品牌推荐
  • 2026年宁波折弯加工订购厂家采购选型实用指南 - 热点品牌推荐
  • 多级缓存架构:推理结果缓存、特征缓存和模型缓存分层设计
  • 成都庭院塑木地板生产基地西南区域高适配采购选型指南 - 热点品牌推荐
  • AI 任务的优先级调度:不同用户、不同任务的资源分配