[LeetCode] 2578. Split With Minimum Sum
Given a positive integer num, split it into two non-negative integers num1 and num2 such that:
- The concatenation of
num1andnum2is a permutation ofnum.- In other words, the sum of the number of occurrences of each digit in
num1andnum2is equal to the number of occurrences of that digit innum.
- In other words, the sum of the number of occurrences of each digit in
num1andnum2can contain leading zeros.
Return the minimum possible sum of num1 and num2.
Notes:
- It is guaranteed that
numdoes not contain any leading zeros. - The order of occurrence of the digits in
num1andnum2may differ from the order of occurrence ofnum.
Example 1:
Input: num = 4325 Output: 59 Explanation: We can split 4325 so thatnum1is 24 and num2is35, giving a sum of 59. We can prove that 59 is indeed the minimal possible sum.
Example 2:
Input: num = 687 Output: 75 Explanation: We can split 687 so thatnum1is 68 andnum2is 7, which would give an optimal sum of 75.
Constraints:
10 <= num <= 109
最小和分割。
给你一个正整数
num,请你将它分割成两个非负整数num1和num2,满足:
num1和num2直接连起来,得到num各数位的一个排列。
- 换句话说,
num1和num2中所有数字出现的次数之和等于num中所有数字出现的次数。num1和num2可以包含前导 0 。请你返回
num1和num2可以得到的和的 最小 值。注意:
num保证没有前导 0 。
num1和num2中数位顺序可以与num中数位顺序不同。
思路是贪心。具体做法是把 num 先转换成一个 charArray,对其排序,然后遍历这个 charArray,将遍历到的每个 digit 分配到 num1 和 num2 中,以这种方式最后拼接出来的 num1 和 num2 才是最小的。
时间O(nlogn)
空间O(n)
Java实现
1 class Solution { 2 public int splitNum(int num) { 3 char[] nums = String.valueOf(num).toCharArray(); 4 Arrays.sort(nums); 5 int n = nums.length; 6 int num1 = 0; 7 int num2 = 0; 8 boolean flag = true; 9 for (int i = 0; i < n; i++) { 10 char cur = nums[i]; 11 if (flag) { 12 num1 = num1 * 10 + cur - '0'; 13 } else { 14 num2 = num2 * 10 + cur - '0'; 15 } 16 flag = !flag; 17 } 18 return num1 + num2; 19 } 20 }

浙公网安备 33010602011771号