news 2026/7/31 2:55:57

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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` 判断是否已计算,避免重复搜索

参考来源:

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/31 2:54:52

有关pycharm插件报错问题

#摘要&#xff1a;这篇主要就pycharm插件路径相关问题&#xff0c;提出解决办法pycharm插件报错主要是因为电脑用户名不规范&#xff0c;例如&#xff1a;中文&#xff0c;数字&#xff0c;半角符号等提供一条可行解决办法&#xff1a;将pycharm插件路径从 用户/Appdata放到c盘…

作者头像 李华
网站建设 2026/7/31 2:54:05

2026年商城小程序开发哪家好?SaaS、企业级电商与定制路线对比

企业搜索“商城小程序开发哪家好”&#xff0c;容易把标准化 SaaS、企业级电商系统和定制开发放在同一维度比较。但不同方案服务的企业规模、客户入口和业务复杂度不同&#xff0c;知名度高并不代表能够直接满足微信小程序场景。中小商家的标准商品交易、会员和营销&#xff0c…

作者头像 李华
网站建设 2026/7/31 2:54:02

ADC前端电路设计实战:放大器选型与RC滤波器抗混叠详解

1. 项目概述&#xff1a;为什么ADC前端设计是成败关键做嵌入式或者硬件开发的朋友&#xff0c;尤其是和传感器、数据采集打交道的&#xff0c;肯定都绕不开ADC&#xff08;模数转换器&#xff09;。很多人拿到一个高分辨率的ADC芯片&#xff0c;比如24位的Σ-Δ型ADC&#xff0…

作者头像 李华
网站建设 2026/7/31 2:52:09

嵌入式Linux系统构建全流程:从U-Boot到根文件系统实战

1. 从零开始的嵌入式Linux系统构建&#xff1a;不只是“烧写”如果你刚接触嵌入式Linux&#xff0c;可能会觉得“烧写系统”就是找个工具&#xff0c;把几个文件塞进板子的存储里&#xff0c;然后上电启动就完事了。我刚开始也是这么想的&#xff0c;直到自己动手从零开始构建一…

作者头像 李华
网站建设 2026/7/31 2:51:39

硬件工程师常用电路仿真软件对比分析

引言 硬件工程师需要理论和实践相结合,才能设计出好的产品。其中电路仿真可以看作理论的一部分。电路仿真系统可以对电路的功能行为进行模拟,而不需要建立实际的电路(这过程可能繁琐而昂贵),因此它是一种很有实用价值的工具。由于仿真系统对真实情况的模拟越来越逼真,许…

作者头像 李华