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
相关推荐
五月底_7 分钟前
LIS算法
python·算法·最长子序列
学学酱快乐31 分钟前
2026年PMP考试生命周期选择决策树精讲:从需求判断到混合型统一框架的应试全攻略
算法·决策树·机器学习·pmp新版考试大纲·pmp新题型·pmp培训哪家好·pmp培训机构推荐
傅科摆 _ py1 小时前
动态规划复习
算法·动态规划
Wang's Blog1 小时前
PostgreSQL笔记49:向量检索核心算法、索引调优与过滤策略深度解析
笔记·算法·postgresql
疯狂打码的少年1 小时前
【数据结构】交换类排序:冒泡与快速排序
数据结构·笔记·算法·排序算法
嵌入式阿蔡2 小时前
面试高频考点 01:volatile / 中断 / 堆栈 八股精讲
java·面试·职场和发展·嵌入式实时数据库
Nil2082 小时前
leetcode 108有序数组转换为二叉搜索树
数据结构·算法·leetcode
高频因子挖掘机2 小时前
QuantDash 成交量单位统一实战:从“手”到“股”的跨市场量化数据清洗全流程
后端·算法·github
hn小菜鸡2 小时前
LeetCode 763、划分字母区间
数据结构·算法·leetcode
Escalating_xu2 小时前
【C++ STL简介】从六大组件到容器、迭代器与算法协作
java·c++·算法