3723.数位平方和的最大值:构造
【LetMeFly】3723.数位平方和的最大值:构造
力扣题目链接:https://leetcode.cn/problems/maximize-sum-of-squares-of-digits/
给你两个 正 整数 num 和 sum。
如果一个正整数 n 满足以下两个条件,则称其为 好整数 :
n的位数 恰好 为num。n的各位数字之和 恰好 为sum。
一个 好整数 n 的 分数 定义为 n 的各位数字的平方和。
返回一个 字符串 ,表示能获得 最大分数 的 好整数 n。如果有多个可能的整数,返回 最大 的那个。如果不存在这样的整数,返回一个空字符串。
示例 1:
输入: num = 2, sum = 3
输出: "30"
解释:
有 3 个好整数:12、21 和 30。
- 12 的分数是
12 + 22 = 5。 - 21 的分数是
22 + 12 = 5。 - 30 的分数是
32 + 02 = 9。
最大分数是 9,由好整数 30 获得。因此,答案是 "30"。
示例 2:
输入: num = 2, sum = 17
输出: "98"
解释:
有两个好整数:89 和 98。
- 89 的分数是
82 + 92 = 145。 - 98 的分数是
92 + 82 = 145。
最大分数是 145。获得此分数的最大好整数是 98。因此,答案是 "98"。
示例 3:
输入: num = 1, sum = 10
输出: ""
解释:
不存在恰好有 1 位数字且各位数字之和为 10 的整数。因此,答案是 ""。
提示:
1 <= num <= 2 * 1051 <= sum <= 2 * 106
解题方法:字符串构造
$n$个个位数和为$s$,要想使这$n$个数平方和最大,应当使这$n$个数中有尽可能多的$9$。
可以这样想,把一个$1$分给两个个位数$a$和$b$(不放令$a\gt b$),分给哪个可以使平方和更大?
答案是分给$a$,因为$((a+1)^2+b^2)-(a^2+(b+1)^2)=2(a-b)\gt 0$。
所以就是尽量把$s$个资源分给已经比较大的数(每个数最多大到$9$为止)。
如果$sum\gt 9num$则无法构造,否则可以如下方法分配:
- 先分配$\lfloor\frac{sum}{9}\rfloor$个$9$;
- 如果还有余数($sum% 9\neq 0$),则给下一个数分配$sum% 9$;
- 其余的数分配$0$。
时空复杂度
- 时间复杂度$O(num)$
- 空间复杂度$O(1)$,立刻返回值不计入算法空间复杂度
AC代码
C++
1 | |
End
同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~
千篇源码题解已开源
3723.数位平方和的最大值:构造
https://blog.letmefly.xyz/2026/10/14/LeetCode 3723.数位平方和的最大值/