博客
关于我
leetcode 321.拼接最大数
阅读量:669 次
发布时间:2019-03-15

本文共 2178 字,大约阅读时间需要 7 分钟。

为了解决这个问题,我们需要找到两个给定数组中的最长子序列,将它们拼接成一个最大的数,同时保持各自数组的相对顺序。我们可以使用贪心算法和单调栈来高效地实现这一点。

方法思路

  • 问题分析:

    • 给定两个数组,每个数组中的元素表示一个自然数的各位数字。
    • 需要从这两个数组中选出k个数字,拼接成一个最大的数,同时保持各自数组的相对顺序。
  • 关键思路:

    • 使用单调栈来找到每个数组中的最大k个元素的子序列。
    • 合并这两个子序列,生成最大的k位数。
  • 算法选择:

    • 使用单调栈来找到最大子序列,保持相对顺序。
    • 合并两个子序列,生成最大的k位数。
  • 复杂度分析:

    • 时间复杂度:O(m + n),其中m和n是两个数组的长度。
    • 空间复杂度:O(k),用于存储结果数组。
  • 解决代码

    def max_number(nums1, nums2, k):    def max_subsequence(arr, k):        if k == 0 or len(arr) == 0:            return []        stack = []        res = []        for i in range(len(arr)):            pos = i            while stack and stack[-1] < pos:                stack.pop()                if len(res) < k:                    res.append(arr[stack.pop()])            if len(stack) < k:                stack.append(pos)        return res    m = len(nums1)    n = len(nums2)    best = []    start = max(0, k - n)    end = min(k, m)    for k1 in range(start, end + 1):        k2 = k - k1        if k2 < 0 or k2 > n:            continue        sub1 = max_subsequence(nums1, k1)        sub2 = max_subsequence(nums2, k2)        merged = []        i = j = 0        while i < len(sub1) and j < len(sub2):            if sub1[i] > sub2[j]:                merged.append(sub1[i])                i += 1            else:                merged.append(sub2[j])                j += 1        while i < len(sub1):            merged.append(sub1[i])            i += 1        while j < len(sub2):            merged.append(sub2[j])            j += 1        if len(merged) != k:            continue        if not best or len(merged) > len(best):            best = merged        elif len(merged) == len(best) and merged > best:            best = merged    return best# 示例1nums1 = [3,4,6,5]nums2 = [9,1,2,5,8,3]k = 5result = max_number(nums1, nums2, k)print(result)# 示例2nums1 = [6,7]nums2 = [6,0,4]k =5result = max_number(nums1, nums2, k)print(result)# 示例3nums1 = [3,9]nums2 = [8,9]k=3result = max_number(nums1, nums2, k)print(result)

    代码解释

  • max_subsequence函数:

    • 该函数用于从给定数组中找到最大的k个元素的子序列,保持相对顺序。使用单调栈来记录元素位置,确保子序列中的元素是递减的。
  • 主函数:

    • 遍历可能的k1值,从max(0, k-n)到min(k, m)。
    • 计算对应的k2值,确保k2在合理范围内。
    • 调用max_subsequence函数获取两个子序列。
    • 合并两个子序列,生成最大的k位数。
    • 比较所有可能的结果,返回最大的那个。
  • 通过这种方法,我们可以高效地找到最大的k位数,同时保持各自数组的相对顺序。

    转载地址:http://ndqmz.baihongyu.com/

    你可能感兴趣的文章
    PLSQL的DBMS_GETLINE
    查看>>
    quartz简单demo,教你最快使用quartz
    查看>>
    PlutoSDR学习笔记(一)—函数API手册
    查看>>
    Quartz安装包中的15个example
    查看>>
    Quartz学习总结(2)——定时任务框架Quartz详解
    查看>>
    pm2 start命令中的json格式详解
    查看>>
    pm2启动报错
    查看>>
    pm2通过配置文件部署nodejs代码到服务器
    查看>>
    Unknown character set: 'utf8mb4'
    查看>>
    PML调用PDMS内核命令研究
    查看>>
    PMM安装-第一篇
    查看>>
    PMP知识要点(第九章)
    查看>>
    PNETLab 镜像包官方下载太慢?不急,最新版本PNET_4.2.10分享!
    查看>>
    pnpm : 无法加载文件...
    查看>>
    pnpm 如何安装指定版本
    查看>>
    pnpm的设计与npm的对比
    查看>>
    pocoserver无限重启_Poco::TCPServer框架解析
    查看>>
    POCO库中文编程参考指南(4)Poco::Net::IPAddress
    查看>>
    Quartz基本使用(二)
    查看>>
    POC项目安装与使用指南
    查看>>