Welcome to Subscribe On Youtube
3723. Maximize Sum of Squares of Digits
Description
You are given two positive integers num and sum.
A positive integer n is good if it satisfies both of the following:
- The number of digits in
nis exactlynum. - The sum of digits in
nis exactlysum.
The score of a good integer n is the sum of the squares of digits in n.
Return a string denoting the good integer n that achieves the maximum score. If there are multiple possible integers, return the maximum one. If no such integer exists, return an empty string.
Example 1:
Input: num = 2, sum = 3
Output: "30"
Explanation:
There are 3 good integers: 12, 21, and 30.
- The score of 12 is
12 + 22 = 5. - The score of 21 is
22 + 12 = 5. - The score of 30 is
32 + 02 = 9.
The maximum score is 9, which is achieved by the good integer 30. Therefore, the answer is "30".
Example 2:
Input: num = 2, sum = 17
Output: "98"
Explanation:
There are 2 good integers: 89 and 98.
- The score of 89 is
82 + 92 = 145. - The score of 98 is
92 + 82 = 145.
The maximum score is 145. The maximum good integer that achieves this score is 98. Therefore, the answer is "98".
Example 3:
Input: num = 1, sum = 10
Output: ""
Explanation:
There are no integers that have exactly 1 digit and whose digits sum to 10. Therefore, the answer is "".
Constraints:
1 <= num <= 2 * 1051 <= sum <= 2 * 106
Solutions
Solution 1: Greedy
If $\text{num} \times 9 < \text{sum}$, then there is no valid good integer, so we return an empty string.
Otherwise, we can use as many digits $9$ as possible to form the good integer, since $9^2$ is the largest and will maximize the score. Specifically, we calculate how many $9$s are contained in $\text{sum}$, denoted as $k$, and the remaining part $s = \text{sum} - 9 \times k$. Then, we construct the good integer with the first $k$ digits as $9$. If $s > 0$, we append a digit $s$ at the end, and finally pad with $0$s to reach a total of $\text{num}$ digits.
The time complexity is $O(\text{num})$ and the space complexity is $O(\text{num})$, where $\text{num}$ is the number of digits in the good integer.
-
class Solution { public String maxSumOfSquares(int num, int sum) { if (num * 9 < sum) { return ""; } int k = sum / 9; sum %= 9; StringBuilder ans = new StringBuilder("9".repeat(k)); if (sum > 0) { ans.append(sum); } ans.append("0".repeat(num - ans.length())); return ans.toString(); } } -
class Solution { public: string maxSumOfSquares(int num, int sum) { if (num * 9 < sum) { return ""; } int k = sum / 9, s = sum % 9; string ans(k, '9'); if (s > 0) { ans += char('0' + s); } ans += string(num - ans.size(), '0'); return ans; } }; -
class Solution: def maxSumOfSquares(self, num: int, sum: int) -> str: if num * 9 < sum: return "" k, s = divmod(sum, 9) ans = "9" * k if s: ans += digits[s] ans += "0" * (num - len(ans)) return ans -
func maxSumOfSquares(num int, sum int) string { if num*9 < sum { return "" } k, s := sum/9, sum%9 ans := strings.Repeat("9", k) if s > 0 { ans += string('0' + byte(s)) } if len(ans) < num { ans += strings.Repeat("0", num-len(ans)) } return ans } -
function maxSumOfSquares(num: number, sum: number): string { if (num * 9 < sum) { return ''; } const k = Math.floor(sum / 9); const s = sum % 9; let ans = '9'.repeat(k); if (s > 0) { ans += String.fromCharCode('0'.charCodeAt(0) + s); } if (ans.length < num) { ans += '0'.repeat(num - ans.length); } return ans; }