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
相关推荐
小雅痞1 小时前
[Java][Leetcode middle] 36. 有效的数独
java·算法·leetcode
paeamecium1 小时前
【PAT甲级真题】- General Palindromic Number(20)
数据结构·c++·算法·pat考试·pat
逻辑驱动的ken1 小时前
Java高频面试考点场景题27
java·开发语言·面试·职场和发展·求职招聘
北顾笙9801 小时前
day43-数据结构力扣
数据结构·算法·leetcode
sali-tec1 小时前
C# 基于OpenCv的视觉工作流-章69-圆弧测量
图像处理·人工智能·opencv·算法·计算机视觉
AI科技星2 小时前
圓 全域数学·72分册·哈希原本卷(七册分卷 · 72分册 · 习题与猜想版)
人工智能·算法·数学建模·数据挖掘·哈希算法·量子计算
sali-tec2 小时前
C# 基于OpenCv的视觉工作流-章70-轮廓点距
图像处理·人工智能·opencv·算法·计算机视觉
June bug2 小时前
【雅思】阅读填空题和判断题
职场和发展·学习方法
珂朵莉MM2 小时前
第七届全球校园人工智能算法精英大赛-算法巅峰赛产业命题赛第二赛季优化题--虚拟边算法
人工智能·算法