LeetCode热题100-小于 n 的最大数(字节高频题)

该题不在hot-100因为在面试真实遇到所以记录下来。

描述:给定一个数字n,给定一个数组,求数组所有元素可以组成小于n的最大数,数组里面的元素可以重复使用

该题还有变形题:就是元素不可重复使用,本质是一道变形题,难度还是比较大。 最大为 N 的数字组合https://leetcode.cn/problems/numbers-at-most-n-given-digit-set/

思路(和 LeetCode902 同源,贪心 + 数位构造)
  1. 把 n 转字符串 s,长度 len_s

  2. 分两种情况:

    • 情况 1:拼的数位数 < len_s直接用 digits 里最大数字,拼「位数少 1 的全最大数」,一定更小,且是同长度最大
    • 情况 2:拼的数位数 = len_s 逐位贪心试探:
      • 选比当前位小的最大数字 → 后面全填最大数字,直接组成候选
      • 选和当前位相等的数字 → 继续下一位递归
      • 选更大的 → 跳过
  3. 两种情况取最大值即可

    def maxNumberLessThanN(digits, n: int) -> int:
    s = str(n)
    m = len(s)
    digits = list(map(str, digits))
    max_d = max(digits) # 数组里最大数字字符
    res = -1

    复制代码
     # 情况1:构造 长度 = m-1 的最大数(一定比n小)
     if m > 1:
         candidate = int(max_d * (m - 1))
         # 排除前导0
         if candidate != 0:
             res = candidate
    
     # 情况2:构造 长度 = m 且 < n 的最大数
     def dfs(pos, path):
         nonlocal res
         if pos == m:
             num = int(''.join(path))
             if num < n and num > res:
                 res = num
             return
         
         limit = s[pos]
         for d in sorted(digits, reverse=True):
             # 前导0禁止
             if not path and d == '0':
                 continue
             
             if d < limit:
                 # 当前位选更小,后面全填最大数字,直接生成最大候选
                 tmp = path + [d] + [max_d] * (m - pos - 1)
                 num = int(''.join(tmp))
                 if num < n and num > res:
                     res = num
             elif d == limit:
                 # 相等继续往下搜
                 path.append(d)
                 dfs(pos + 1, path)
                 path.pop()
             else:
                 # 比当前位大,直接跳过
                 continue
    
     dfs(0, [])
     return res
相关推荐
是main不是漫7 小时前
【双指针——移动零】数组划分类题目的入门基石
c++·算法
深圳市快瞳科技有限公司8 小时前
野外鸟类AI识别落地实录:输入适配、结构化输出、去重聚合与置信度分流的工程实践
算法·计算机视觉·鸟类识别·鸟类ai识别·野外鸟类观测·林业调查
专注仿真10 小时前
梯度提升类(XFBoost)算法详解与代码实例
开发语言·人工智能·python·算法·大模型训练·控制算法
小豆庄10 小时前
视频遮罩追踪退场后ID撞号的排查—多目标场景下的失效
opencv·算法·bug·视频·python3.11
Tisfy10 小时前
LeetCode 3882.网格图中最小异或路径:动态规划
算法·leetcode·动态规划
D e re k ZH11 小时前
P5025 [SNOI2017] 炸弹
c++·算法
A boy CDEF girl11 小时前
算法题专栏:优选算法
数据结构·算法·leetcode
没落之王11 小时前
三易五行看宋朝的三界确立
大数据·人工智能·算法
坤坤子吖12 小时前
算法学习——单调队列
开发语言·c++·笔记·学习·算法
Js.Tx13 小时前
【具体数学 Concrete Mathematics】2.1.5 一般性的方法
算法·具体数学