IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> Leetcode #321:拼接最大数 -> 正文阅读

[数据结构与算法]Leetcode #321:拼接最大数

Leetcode #321:拼接最大数

题目

题干

问题:拼接最大数

You are given two integer arrays nums1 and nums2 of lengths m and n respectively. nums1 and nums2 represent the digits of two numbers. You are also given an integer k.
Create the maximum number of length k <= m + n from digits of the two numbers. The relative order of the digits from the same array must be preserved.
Return an array of the k digits representing the answer.

给定长度分别为 m 和 n 的两个数组,其元素由 0-9 构成,表示两个自然数各位上的数字。现在从这两个数组中选出 k (k <= m + n) 个数字拼接成一个新的数,要求从同一个数组中取出的数字保持其在原数组中的相对顺序。

求满足该条件的最大数。结果返回一个表示该最大数的长度为 k 的数组。

说明: 请尽可能地优化你算法的时间和空间复杂度。

示例

示例 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]

题解

这道题和之前的316. 去除重复字母类似,只不过之前的题目要求的是一个最小值,这里变成了一个最大值。并且这里是对两个数组进行取值。

  1. 由于有两个列表,都可以取值。当所需取得个数为k的时候,从第一个列表可取 i 个,则第二个列表可以 k - i 个。注意在取值的时候,我们的输入 pick_max(nums, k)的k是所需要取得个数,加入一个nums长度为2, 那么我们的输入 k 最多为2。因此需要对输入pick_max的长度k进行限制。
  2. 两个列表所取总的个数为k,在对两个列表进行总循环的时候,我们for内的值应该是(k+1),这样才能取到长度 k。
  3. 在pick_max内,我们的stack不需要以来就赋值,因为在循环中我们在栈为空的情况下,while循环不成立,所以会有一个入栈的操作。
  4. 最后就是找到了两个列表所取得不同长度得最大列表后怎么进行组合得问题。我们知道python 中列表之间得大小比较是根据第一位数来确定得,所以我们可以直接对两个列表作比较,取出两者之间得较大值。

注意:列表的赋值是一个引用的过程,所以我们对得到的较大列表不用管他是谁,将第一个数字加入输出之后,直接pop第一个数字就可以了进行下一步比较了。

Python

class Solution:
    def __init__(self, nums1, nums2, k):
        self.nums1 = nums1
        self.nums2 = nums2
        self.k = k

    @staticmethod
    def pick_max(num, k):
        """从列表中找到最大的k个数组合(不改变位置)"""
        n = len(num)
        drop = n - k  # 计算需要丢弃的数字个数
  stack = []
        for i in range(n):  # 对之后的每个数进行比较
            while drop and stack and num[i] > stack[-1]:  # 待加入的值比栈顶的值大,则栈顶弹出,丢弃值减一
                stack.pop()
                drop -= 1
            stack.append(num[i])  # 入栈
        return stack[:k]  # 输出需要的长度,因为列表可能是递减的
    
    def max_number(self):
        out = []
        m, n = len(self.nums1), len(self.nums2)
        for i in range(self.k + 1):  # 每个组中循环取 0-k共k+1个数
            if i <= m and self.k - i <= n:  # 注意这里必须对循环的索引进行限制,否则会越界
                res = []
                res1 = self.pick_max(self.nums1, i)  # 得到列表1中的最大子列表
                res2 = self.pick_max(self.nums2, self.k - i)  # 得到列表2中的最大子列表
                while res1 or res2:  # 开始合并,当两者都为空的时候才停止
                    ans = res1 if res1 > res2 else res2  # 两个子列表中较大的一个赋给ans,这里是引用
                    res.append(ans[0])  # 本次输出res,连接较大列表的首个数字,之后再弹出
                    ans.pop(0)  # 这里的ans弹出左边的值,也等于res1或者res2中较大的一个弹出左值,因为列表为引用
                out = max(out, res)  # 对所有的组合中取一个最大的作为输出
          return out
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-04 11:27:49  更:2021-08-04 11:28:12 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年4日历 -2024/4/16 13:44:19-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码