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

    你可能感兴趣的文章
    No 'Access-Control-Allow-Origin' header is present on the requested resource.
    查看>>
    NO 157 去掉禅道访问地址中的zentao
    查看>>
    no available service ‘default‘ found, please make sure registry config corre seata
    查看>>
    no connection could be made because the target machine actively refused it.问题解决
    查看>>
    No Datastore Session bound to thread, and configuration does not allow creation of non-transactional
    查看>>
    No fallbackFactory instance of type class com.ruoyi---SpringCloud Alibaba_若依微服务框架改造---工作笔记005
    查看>>
    No Feign Client for loadBalancing defined. Did you forget to include spring-cloud-starter-loadbalanc
    查看>>
    No mapping found for HTTP request with URI [/...] in DispatcherServlet with name ...的解决方法
    查看>>
    No mapping found for HTTP request with URI [/logout.do] in DispatcherServlet with name 'springmvc'
    查看>>
    No module named 'crispy_forms'等使用pycharm开发
    查看>>
    No module named cv2
    查看>>
    No module named tensorboard.main在安装tensorboardX的时候遇到的问题
    查看>>
    No module named ‘MySQLdb‘错误解决No module named ‘MySQLdb‘错误解决
    查看>>
    No new migrations found. Your system is up-to-date.
    查看>>
    No qualifying bean of type XXX found for dependency XXX.
    查看>>
    No resource identifier found for attribute 'srcCompat' in package的解决办法
    查看>>
    no session found for current thread
    查看>>
    No toolchains found in the NDK toolchains folder for ABI with prefix: mips64el-linux-android
    查看>>
    NO.23 ZenTaoPHP目录结构
    查看>>
    no1
    查看>>