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

    你可能感兴趣的文章
    python基础篇(15):闭包
    查看>>
    python基础篇(14):多态
    查看>>
    python基础篇(13):类型注解
    查看>>
    python基础篇(12):继承
    查看>>
    python基础篇(11):封装
    查看>>
    python基础篇(10):自定义包
    查看>>
    python基础篇(10):类、对象与构造方法
    查看>>
    python系列【仅供参考】:python测试javaSDK总结
    查看>>
    python系列【仅供参考】:python斗地主
    查看>>
    Python基础教程(第2版 修订版) pdf
    查看>>
    python基础实践(四)
    查看>>
    Python基础学习笔记(九)常用数据类型转换函数
    查看>>
    Python基础学习参考(五):字符串和编码
    查看>>
    Python基础学习
    查看>>
    python基础变量之---集合
    查看>>
    python基础变量之---字典
    查看>>
    python基础变量之---列表
    查看>>
    python基础变量之---元组
    查看>>
    python基础内容_Python基础入门必须了解的
    查看>>
    Python基础之面向对象2(封装)
    查看>>