【LeetCode: 2578. 最小和分割 | 贪心】-LMLPHP

【LeetCode: 2578. 最小和分割 | 贪心】-LMLPHP

【LeetCode: 2578. 最小和分割 | 贪心】-LMLPHP

🚩 题目链接

⛲ 题目描述

给你一个正整数 num ,请你将它分割成两个非负整数 num1 和 num2 ,满足:

num1 和 num2 直接连起来,得到 num 各数位的一个排列。
换句话说,num1 和 num2 中所有数字出现的次数之和等于 num 中所有数字出现的次数。
num1 和 num2 可以包含前导 0 。
请你返回 num1 和 num2 可以得到的和的 最小 值。

注意:

num 保证没有前导 0 。
num1 和 num2 中数位顺序可以与 num 中数位顺序不同。

示例 1:

输入:num = 4325
输出:59
解释:我们可以将 4325 分割成 num1 = 24 和 num2 = 35 ,和为 59 ,59 是最小和。
示例 2:

输入:num = 687
输出:75
解释:我们可以将 687 分割成 num1 = 68 和 num2 = 7 ,和为最优值 75 。

提示:

10 <= num <= 109

🌟 求解思路&实现代码&运行结果


⚡ 贪心

🥦 求解思路
  1. 题目让我们求的是如何将一个数字拆分为俩个不同的数字,数字的顺序可以打乱,也就是任意组合,最终求解的是俩个数字的最小和。
  2. 因为顺序不影响最终的结果,所以,我们先对拆分后的数组升序排序。然后对其进行组合。
  3. 怎么组合呢?也就是贪心的规律所在,俩个数差距尽可能小的原则,进行组合。
  4. 怎么实现呢?对排序后的数组遍历,从左向右,将数字挨个分配给第一个数和第二个数。最终求和的结果就是答案。
  5. 具体求解的过程步骤请看下面代码。
🥦 实现代码
class Solution {

    private char[] c;
    private int n;
    
    public int splitNum(int num) {
        this.c=String.valueOf(num).toCharArray();
        Arrays.sort(c);
        this.n=c.length;
        int num1=getNumber(0);
        int num2=getNumber(1);
        return num1+num2;
    }

    public int getNumber(int flag){
        StringBuilder sb=new StringBuilder("");
        for(int i=flag;i<c.length;i+=2){
            sb.append(c[i]+"");
        }
        return Integer.parseInt(sb.toString());
    }
}
🥦 运行结果

【LeetCode: 2578. 最小和分割 | 贪心】-LMLPHP


💬 共勉

【LeetCode: 2578. 最小和分割 | 贪心】-LMLPHP

【LeetCode: 2578. 最小和分割 | 贪心】-LMLPHP

10-09 16:06