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

    你可能感兴趣的文章
    Netty源码—4.客户端接入流程二
    查看>>
    Netty源码—5.Pipeline和Handler一
    查看>>
    Netty源码—6.ByteBuf原理二
    查看>>
    Netty源码—7.ByteBuf原理三
    查看>>
    Netty源码—7.ByteBuf原理四
    查看>>
    Netty源码—8.编解码原理二
    查看>>
    Netty源码解读
    查看>>
    Netty的Socket编程详解-搭建服务端与客户端并进行数据传输
    查看>>
    Netty相关
    查看>>
    Network Dissection:Quantifying Interpretability of Deep Visual Representations(深层视觉表征的量化解释)
    查看>>
    Network Sniffer and Connection Analyzer
    查看>>
    NetworkX系列教程(11)-graph和其他数据格式转换
    查看>>
    Networkx读取军械调查-ITN综合传输网络?/读取GML文件
    查看>>
    Net与Flex入门
    查看>>
    net包之IPConn
    查看>>
    NFinal学习笔记 02—NFinalBuild
    查看>>
    NFS共享文件系统搭建
    查看>>
    nfs复习
    查看>>
    NFS网络文件系统
    查看>>
    ng 指令的自定义、使用
    查看>>