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
相关推荐
2601_962218615 小时前
万象生鲜系统业财一体化底层打通技术自动生成经营账单
大数据·数据库·人工智能·python·算法
吞下星星的少年·-·5 小时前
The 2026 ICPC Asia East Continent Online Contest (II)(构造)
数据结构·算法
stolentime6 小时前
洛谷P10515 转圈题解
c++·算法·数学建模·贪心算法
和裕7 小时前
蜂窝板 vs 七层瓦楞重型纸箱:大件工业设备运输性能与成本全对比
大数据·运维·网络·人工智能·算法
衡石科技7 小时前
Data_Agent记忆机制与经验复用衡石分析智能体会话记忆与长期学习技术解析
人工智能·科技·学习·算法·企业级bi
shirsl9 小时前
算法 Day 2 滑动窗口 + 栈 / 单调栈
开发语言·python·算法
土司大王10 小时前
LeetCode hot100 回溯专题总结:Java 通用模板、决策树模型
java·算法·leetcode·决策树
2601_9622186110 小时前
万象生鲜系统订单全生命周期状态同步技术实现业务可视
大数据·数据库·人工智能·python·算法
那年窗外下的雪.10 小时前
AIDC 学习日志|第 22 天|All-Active/Single-Active 故障演练设计
服务器·网络·学习·算法·哈希算法
wzdark11 小时前
基于启发式搜索的最优路径规划算法研究4
算法