日常刷题(24)

1. 拼接最大数

1.1. 题目描述

给你两个整数数组 nums1 和 nums2,它们的长度分别为 m 和 n。数组 nums1 和 nums2 分别代表两个数各位上的数字。同时你也会得到一个整数 k。

请你利用这两个数组中的数字中创建一个长度为 k <= m + n 的最大数,在这个必须保留来自同一数组的数字的相对顺序。

返回代表答案的长度为 k 的数组。

1.2. 示例

示例 1:

输入:nums1 = 3,4,6,5, nums2 = 9,1,2,5,8,3, k = 5

输出:9,8,6,5,3

示例 2:

输入:nums1 = 6,7, nums2 = 6,0,4, k = 5

输出:6,7,6,0,4

示例 3:

输入:nums1 = 3,9, nums2 = 8,9, k = 3

输出:9,8,9

1.3. 题目解析

  1. 找最大子串
  2. 拼接最大子串

1.4. 代码

python 复制代码
class Solution:
    def get_max_subsequence(self, nums, k):
        stack = []
        drop = len(nums) - k
        for num in nums:
            while stack and drop and stack[-1] < num:
                stack.pop()
                drop -= 1
            stack.append(num)
        return stack

    def merge(self, nums1, nums2):
        stack = []
        while nums1 or nums2:
            # 比较第一位数大小
            nums = nums1 if nums1 > nums2 else nums2
            stack.append(nums.pop(0))
        return stack

    def __call__(self, nums1, nums2, k):
        ans = []
        for i in range(k):
            if i > len(nums1) or k - i > len(nums2):
                continue
            stack1, stack2 = self.get_max_subsequence(nums1, i), self.get_max_subsequence(nums2, k - i)
            stack = self.merge(stack1, stack2)[:k]
            if len(stack) != k:
                continue
            ans = max(stack, ans)
        return ans
相关推荐
databook2 小时前
时间序列数据,先拆规律还是先查异常
python·数据挖掘·数据分析
师夷长技以自愈2 小时前
手搓 AI Agent 第 8 篇:从手写循环到画流程图——LangGraph 封装
人工智能·python
jyOverQ2 小时前
从零学 JVM(六):垃圾回收算法详解——标记清除、标记复制与标记整理
jvm·算法
aifannihao3 小时前
Rust 1.100 的 DropGuard:用 Python 实测失败回滚与吞异常
python·rust·异常处理·标准库·contextlib
严肃小白兔4 小时前
第 06/24 期:神经网络的反向传播算法:从链式法则到梯度计算
人工智能·神经网络·算法
落羽的落羽5 小时前
【C++】C++17的主要特性
linux·服务器·开发语言·c++·算法·机器学习
用户019027581615 小时前
天勤 tqsdk 能做 A 股行情吗?期货强项与股票数据选型
python
【心态好不摆烂】5 小时前
数据结构基础精讲3
数据结构·算法
岑梓铭5 小时前
《考研408数据结构》第七章(B树 和 B+树)复习笔记
数据结构·笔记·b树·考研·408