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

Kimi LeetCode 3791. 给定范围内平衡整数的数目 Java实现

以下是 LeetCode 3791. 给定范围内平衡整数的数目 的 Java 实现。

题目理解

一个整数是平衡的,当且仅当:
1. 至少包含两位数字
2. 奇数位数字之和等于偶数位数字之和(最左边数字位置为1)

例如:`121` 是平衡的(奇数位 1+1=2,偶数位 2=2),而 `1234` 不是(奇数位 1+3=4,偶数位 2+4=6)。

约束:`1 <= low <= high <= 10^15`,直接暴力枚举不可行,需要使用数位 DP。

解题思路

核心思想:计算 `[1, high]` 中平衡整数的个数,减去 `[1, low-1]` 中平衡整数的个数。

数位 DP 状态定义:`dfs(pos, diff, lim)`:
- `pos`:当前处理到第几位
- `diff`:奇数位和减去偶数位和的差值
- `lim`:是否受上界限制

`base = 90` 作为偏移量(因为最多15位,每位最大9,差值范围 [-90, 90])。

Java 实现

```java
class Solution {
private char[] num;
private Long[][] f;
private final int base = 90;

public long countBalanced(long low, long high) {
// 如果 high < 11,范围内没有至少两位的数,直接返回0
if (high < 11) {
return 0;
}
// low 至少要从11开始(因为10不是平衡的,11才是)
low = Math.max(low, 11);

// 计算 [1, low-1] 中平衡整数的个数
num = String.valueOf(low - 1).toCharArray();
f = new Long[num.length][base << 1 | 1];
long a = dfs(0, 0, true);

// 计算 [1, high] 中平衡整数的个数
num = String.valueOf(high).toCharArray();
f = new Long[num.length][base << 1 | 1];
long b = dfs(0, 0, true);

// 结果为两者的差
return b - a;
}

private long dfs(int pos, int diff, boolean lim) {
// 所有位处理完毕
if (pos >= num.length) {
return diff == 0 ? 1 : 0;
}
// 记忆化:不受限制时,直接返回已计算的结果
if (!lim && f[pos][diff + base] != null) {
return f[pos][diff + base];
}
// 当前位能填的最大数字
int up = lim ? num[pos] - '0' : 9;
long res = 0;
for (int i = 0; i <= up; ++i) {
// pos 从0开始,对应第1位(奇数位)
// 奇数位(pos%2==0)加 i,偶数位(pos%2==1)减 i
res += dfs(pos + 1, diff + i * (pos % 2 == 0 ? 1 : -1), lim && i == up);
}
// 保存不受限制时的结果
if (!lim) {
f[pos][diff + base] = res;
}
return res;
}
}
```

复杂度分析

- 时间复杂度:`O(log² M × D²)`,其中 `M = high`,`D = 10`
- 空间复杂度:`O(log² M × D)`,主要是记忆化数组的空间

关键要点

1. base 偏移:差值 `diff` 可能为负数,用 `base = 90` 做偏移,使数组下标非负
2. pos 的奇偶性:`pos % 2 == 0` 对应第1、3、5...位(奇数位,从1开始计数),加 `i`;否则减 `i`
3. 边界处理:`low < 11` 时调整为11,因为单个数字不可能平衡
4. 记忆化数组:`Long[][]` 用 `null` 判断是否已计算,避免重复搜索

参考来源:

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

相关文章:

  • 有关pycharm插件报错问题
  • 2026年商城小程序开发哪家好?SaaS、企业级电商与定制路线对比
  • ADC前端电路设计实战:放大器选型与RC滤波器抗混叠详解
  • 嵌入式Linux系统构建全流程:从U-Boot到根文件系统实战
  • 硬件工程师常用电路仿真软件对比分析
  • 高性能实时流媒体服务器实战指南:go2rtc企业级摄像头集成解决方案
  • Webswing:零代码改造,将Swing桌面应用无缝迁移至浏览器
  • 开尔文四线检测原理与应用:精准测量低电阻的核心技术
  • Java NIO底层原理:从Linux系统调用到高性能网络编程实践
  • Modbus RTU协议详解:从原理到实战的工业通信指南
  • go: Gale-Shapley Algorithm
  • 基于读写锁的读者写者问题
  • 游戏开发者日志解析:从武器设计到技术实现全流程
  • 685743
  • 每月省2小时:2026年3款荣耀实时转文字哪个好?实测选出高性价比款
  • 芯片与嵌入式系统开发:软件仿真、硬件仿真与原型验证全解析
  • 从Kafka到LLM:我们如何用流式日志构建反爬虫知识图谱
  • Adobe GenP 3.0技术深度解析:如何实现Adobe全家桶的智能激活方案
  • 5步掌握开源AI视频生成:从零到一的完整指南
  • C++20协程与Qt异步编程:QCoro库原理与实践指南
  • 大语言模型表征引导技术解析与实践
  • Unity 3D服装系统定制:模块化架构与性能优化实战
  • STM32标准库+FreeRTOS实现USB虚拟串口(CDC)完整移植指南
  • 物联网安全期末复习指南:从三层架构到9大核心考点解析
  • Go语言安全扫描实战:Gosec终极配置指南与CI/CD集成
  • 从游戏残局到团队协作:静音协作法解决信息过载
  • 告别Go GC!ClickHouse重构WAL-G,Rust让Postgres备份更高效
  • STM32驱动FM24CL64B FRAM:I2C接口高耐久存储实战指南
  • 中文情感分析数据集全攻略:从选型、评估到BERT实战应用
  • nfs服务器的相关知识