博客
关于我
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/

    你可能感兴趣的文章
    Network 灰鸽宝典【目录】
    查看>>
    NetworkX系列教程(11)-graph和其他数据格式转换
    查看>>
    Networkx读取军械调查-ITN综合传输网络?/读取GML文件
    查看>>
    network小学习
    查看>>
    Netwox网络工具使用详解
    查看>>
    Net与Flex入门
    查看>>
    net包之IPConn
    查看>>
    Net操作配置文件(Web.config|App.config)通用类
    查看>>
    Neutron系列 : Neutron OVS OpenFlow 流表 和 L2 Population(7)
    查看>>
    New Relic——手机应用app开发达人的福利立即就到啦!
    查看>>
    NFinal学习笔记 02—NFinalBuild
    查看>>
    NFS
    查看>>
    NFS Server及Client配置与挂载详解
    查看>>
    NFS共享文件系统搭建
    查看>>
    nfs复习
    查看>>
    NFS安装配置
    查看>>
    NFS的安装以及windows/linux挂载linux网络文件系统NFS
    查看>>
    NFS的常用挂载参数
    查看>>
    NFS网络文件系统
    查看>>
    nft文件传输_利用remoting实现文件传输-.NET教程,远程及网络应用
    查看>>