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
相关推荐
小蒋学算法21 小时前
算法-M个非重叠子数组最大和II-WQS二分学习
数据结构·学习·算法
我要见SA姐11 天前
AI提示词遇见精密算法:TimeGuessr如何用数学魔法打造文化游戏新体验
人工智能·算法·游戏
Jerry1 天前
LeetCode 56. 合并区间
算法
实验如有神祝女士1 天前
不同参数规模大模型在医学翻译场景的适配差异
论文阅读·人工智能·深度学习·学习·算法·语言模型·论文笔记
windliang1 天前
Claude Code 源码分析(三):一次模型回答如何流进 Agent
前端·算法·ai编程
Kyrie_kk1 天前
Java--BigInteger 超大整数计算
java·算法
汽车网络安全爱好者1 天前
Public Key Infrastructure(二)— 深入理解 X.509 证书:从 RFC 5280 到 OpenSSL 实践
运维·服务器·算法·网络安全·汽车·密码学·可信计算技术
tkevinjd1 天前
力扣131-分割回文串
算法·leetcode·深度优先
BioRunYiXue1 天前
技术干货 | LiP-MS全流程解析:从实验设计到数据分析
大数据·前端·javascript·人工智能·算法·数据挖掘·数据分析
Jasmine_llq1 天前
《P11246 [GESP202409 六级] 小杨和整数拆分》
算法·数学定理版本·时间复杂度n1/2·dp 版本