贪心题目:十-二进制数的最少数目

文章目录

题目

标题和出处

标题:十-二进制数的最少数目

出处:1689. 十-二进制数的最少数目

难度

4 级

题目描述

要求

如果一个十进制数字不含任何前导零,且每一位上的数字都是 0 \texttt{0} 0 或 1 \texttt{1} 1,那么该数字就是一个十-二进制数 。例如, 101 \texttt{101} 101 和 1100 \texttt{1100} 1100 都是十-二进制数 ,而 112 \texttt{112} 112 和 3001 \texttt{3001} 3001 不是。

给定一个表示十进制整数的字符串 n \texttt{n} n,返回和为 n \texttt{n} n 的十-二进制数 的最少数目。

示例

示例 1:

输入: n = "32" \texttt{n = "32"} n = "32"

输出: 3 \texttt{3} 3

解释: 10 + 11 + 11 = 32 \texttt{10} + \texttt{11} + \texttt{11} = \texttt{32} 10+11+11=32

示例 2:

输入: n = "82734" \texttt{n = "82734"} n = "82734"

输出: 8 \texttt{8} 8

示例 3:

输入: n = "27346209830709182346" \texttt{n = "27346209830709182346"} n = "27346209830709182346"

输出: 9 \texttt{9} 9

数据范围

  • 1 ≤ n.length ≤ 10 5 \texttt{1} \le \texttt{n.length} \le \texttt{10}^\texttt{5} 1≤n.length≤105
  • n \texttt{n} n 仅由数字组成
  • n \texttt{n} n 不含任何前导零并总是表示正整数

解法

思路和算法

对于字符串 n n n 的每一位 digit \textit{digit} digit,当 digit > 0 \textit{digit} > 0 digit>0 时至少需要 digit \textit{digit} digit 个十-二进制数作为加数才能满足所有加数之和的当前位等于 digit \textit{digit} digit。理由如下。

  • 如果不发生进位,则如果作为加数的十进制数个数小于 digit \textit{digit} digit,则一定存在加数的该位上的值大于 1 1 1,不符合十-二进制数的要求。

  • 如果发生进位,则进位来源于更低位,此时至少需要 10 × digit 10 \times \textit{digit} 10×digit 个十-二进制数,否则一定存在加数的更低位上的值大于 1 1 1,不符合十-二进制数的要求。

将字符串 n n n 中的最大的一位数记为 maxDigit \textit{maxDigit} maxDigit,则和为 n n n 的十-二进制数的最少数目一定大于等于 maxDigit \textit{maxDigit} maxDigit。可以构造出和为 n n n 的 maxDigit \textit{maxDigit} maxDigit 个十-二进制数,做法如下。

  1. 创建 maxDigit \textit{maxDigit} maxDigit 个与 n n n 长度相同的十-二进制数,初始时每个十-二进制数的所有位都是 0 0 0。允许存在前导零。

  2. 对于 n n n 中等于 maxDigit \textit{maxDigit} maxDigit 的每一位,将全部 maxDigit \textit{maxDigit} maxDigit 个十-二进制数的对应位上的值设为 1 1 1。

  3. 对于 n n n 中大于 0 0 0 且小于 maxDigit \textit{maxDigit} maxDigit 的每一位,将该位的值记为 digit \textit{digit} digit,则 digit < maxDigit \textit{digit} < \textit{maxDigit} digit<maxDigit,从 maxDigit \textit{maxDigit} maxDigit 个十-二进制数中任选 digit \textit{digit} digit 个数将对应位上的值设为 1 1 1。

由于每次对 maxDigit \textit{maxDigit} maxDigit 个十-二进制数的赋值都只是对其中的一个数位操作,且每次操作的数位各不相同,因此构造出的和为 n n n 的 maxDigit \textit{maxDigit} maxDigit 个十进制数都符合十-二进制数的要求。

根据上述分析,可以使用贪心的思想计算和为 n n n 的十-二进制数的最少数目。

具体做法是,遍历字符串 n n n 并得到最大的一位数 maxDigit \textit{maxDigit} maxDigit,则 maxDigit \textit{maxDigit} maxDigit 即为最少数目。

代码

java 复制代码
class Solution {
    public int minPartitions(String n) {
        int maxDigit = 0;
        int length = n.length();
        for (int i = 0; i < length; i++) {
            int digit = n.charAt(i) - '0';
            maxDigit = Math.max(maxDigit, digit);
        }
        return maxDigit;
    }
}

复杂度分析

  • 时间复杂度: O ( m ) O(m) O(m),其中 m m m 是字符串 n n n 的长度。需要遍历字符串 n n n 一次并计算最少数目。

  • 空间复杂度: O ( 1 ) O(1) O(1)。

相关推荐
伟大的车尔尼2 天前
贪心题目:不含 AAA 或 BBB 的字符串
贪心
伟大的车尔尼3 天前
贪心题目:最少的后缀翻转次数
贪心
lvwangshu4 天前
P12960 毒药 题解
动态规划·题解·贪心·技巧·性质题·思维好题
伟大的车尔尼13 天前
贪心题目:优势洗牌
贪心
Logic10113 天前
C语言/数据结构动态规划题解:Kadane算法求最大子数组和——O(n)时间O(1)空间
c语言·数据结构·动态规划·贪心·时间复杂度·算法题·最大子数组和
伟大的车尔尼15 天前
贪心题目:分发饼干
贪心
Tisfy16 天前
LeetCode 2472.不重叠回文子字符串的最大数目:动态规划(贪心)
动态规划·字符串·题解·贪心·dp·回文字符串
伟大的车尔尼20 天前
贪心题目:三角形的最大周长
贪心
青少儿编程课堂21 天前
贪心算法进阶:区间调度与最少资源整合解析
c++·python·算法·贪心·信息学竞赛·区间调度