LeetCode 321. 拼接最大数(单调栈)*

文章目录

    • 1. 题目
    • 2. 解题

1. 题目

给定长度分别为 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]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/create-maximum-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

采用动态规划,long long 存不下,溢出,采用string,超时

class Solution {
public:vector<int> maxNumber(vector<int>& nums1, vector<int>& nums2, int k) {int m = nums1.size(), n = nums2.size();typedef long long ll;vector<vector<vector<ll>>> dp(k+1, vector<vector<ll>>(m+1, vector<ll>(n+1, -1)));dp[0][0][0] = 0;string str;for(int t = 1; t <= k; t++) {for(int i = 0; i <= m; i++){                for(int j = 0; j <= n; j++){if(dp[t-1][i][j] == -1)continue;if(i < m){dp[t][i+1][j] = max(dp[t][i+1][j], dp[t-1][i][j]*10+nums1[i]);dp[t-1][i+1][j] = max(dp[t-1][i+1][j], dp[t-1][i][j]);}                    if(j < n){dp[t][i][j+1] = max(dp[t][i][j+1], dp[t-1][i][j]*10+nums2[j]);dp[t-1][i][j+1] = max(dp[t-1][i][j+1], dp[t-1][i][j]);}}}}vector<int> ans(k, 0);ll res = 0;for(int i = 0; i <= m; ++i){for(int j = 0; j <= n; ++j)res = max(res, dp[k][i][j]);}for(int i = k-1; i >= 0; --i){ans[i] = res%10;res /= 10;}return ans;}
};

string 超时

class Solution {
public:vector<int> maxNumber(vector<int>& nums1, vector<int>& nums2, int k) {int m = nums1.size(), n = nums2.size();vector<vector<vector<string>>> dp(k+1, vector<vector<string>>(m+1, vector<string>(n+1, "#")));dp[0][0][0] = "/";string str;for(int t = 1; t <= k; t++) {for(int i = 0; i <= m; i++){                for(int j = 0; j <= n; j++){if(dp[t-1][i][j] == "#")continue;  if(i < m){str = to_string(nums1[i]);dp[t][i+1][j] = max(dp[t][i+1][j], dp[t-1][i][j]+str);dp[t-1][i+1][j] = max(dp[t-1][i+1][j], dp[t-1][i][j]);}                    if(j < n){str = to_string(nums2[j]);dp[t][i][j+1] = max(dp[t][i][j+1], dp[t-1][i][j]+str);dp[t-1][i][j+1] = max(dp[t-1][i][j+1], dp[t-1][i][j]);}}}}vector<int> ans(k, 0);string res = "";for(int i = 0; i <= m; ++i){for(int j = 0; j <= n; ++j)res = max(res, dp[k][i][j]);}for(int i = 0; i < k; ++i)ans[i] = res[i+1]-'0';return ans;}
};
  • 枚举所有可能的长度组合 {i, k-i}
  • 从数组里取出 x 个数,使之最大(单调栈法)(参考:LeetCode 5614. 找出最具竞争力的子序列(单调栈))
  • 再合并取出来的两个数组(遇到相等的,往后找,找完了,有剩余的先取)
class Solution {vector<int> tmp;
public:vector<int> maxNumber(vector<int>& nums1, vector<int>& nums2, int k) {int n1 = nums1.size(), n2 = nums2.size();tmp.resize(k);int r = min(n1, k);vector<int> ans;for(int i = 0; i <= r; ++i){if(k-i > n2)continue;auto arr1 = select(nums1, i);auto arr2 = select(nums2, k-i);merge(arr1, arr2, ans);}return ans;}vector<int> select(vector<int>& nums, int k){if(k == nums.size())return nums;vector<int> stk;for(int i = 0; i < nums.size(); ++i){while(!stk.empty() && stk.size()+nums.size()-i > k && stk.back() < nums[i])stk.pop_back();stk.push_back(nums[i]);}stk.resize(k);return stk;}void merge(vector<int>& a1, vector<int>& a2, vector<int>& ans){int n1 = a1.size(), n2 = a2.size(), i = 0, j = 0, idx = 0;while(i < n1 && j < n2){if(compare(a1, i, a2, j) >= 0)tmp[idx++] = a1[i++];elsetmp[idx++] = a2[j++];}while(i < n1)tmp[idx++] = a1[i++];while(j < n2)tmp[idx++] = a2[j++];if(ans.empty())ans = tmp;else if(ans < tmp)ans = tmp;}int compare(vector<int>& a1, int i, vector<int>& a2, int j){int n1 = a1.size(), n2 = a2.size();while(i < n1 && j < n2){int diff = a1[i] - a2[j];if(diff != 0)return diff;i++,j++;}return (n1-i)-(n2-j);//相等话,有剩余的先取}
};

144 ms 20.6 MB C++


我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!
Michael阿明

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/473452.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pandas数据分析选则接近数值的最接优方案

import numpy as np import pandas as pd# pandas数据分析选则接近数值的最接优方案# 1.准备数据 CHILD_TABLE (720, 750) CHIDL_STOOL (300, 350) CHILD_PLAY_LEN (300, 400) CHILD_TENT (1100, 1300) # 2.遍历循环&#xff0c;添加到列表中 sum_length_lst [] play_lst …

iOS开发者有价值的工具集

转载于&#xff1a;http://www.cocoachina.com/applenews/devnews/2014/0307/7936.html我一直比较推崇聪明地工作要远胜于刻苦地工作。使用正确的工具可以帮你更好地解决问题&#xff0c;直达目标。我们都遇见过一些功能非常强大但又价值不菲的工具&#xff0c;虽然价格贵点&am…

Python数据分析之pandas学习

Python中的pandas模块进行数据分析。 接下来pandas介绍中将学习到如下8块内容&#xff1a;1、数据结构简介&#xff1a;DataFrame和Series2、数据索引index3、利用pandas查询数据4、利用pandas的DataFrames进行统计分析5、利用pandas实现SQL操作6、利用pandas进行缺失值的处理7…

牛客 String II

文章目录1. 题目2. 解题1. 题目 链接&#xff1a;https://ac.nowcoder.com/acm/contest/9715/B 来源&#xff1a;牛客网 给出一个仅包含小写字母的字符串s&#xff0c;你最多可以操作k次&#xff0c;使得任意一个小写字母变为与其相邻的小写字母&#xff08;ASCII码差值的绝对…

STM32的RTC万年历显示问题

博客整理后写出来的,有点乱,大家见谅! 想让串口输出万年历效果.每次秒刷新一次 结果是串口软件一直输出,看起来很难受 先讲一讲C代码的\r和\n的区别 \r 就是return 回到 本行 行首 这就会把这一行以前的输出 覆盖掉 \n 是回车&#xff0b;换行 把光标 先移到 行首 然后换到下一…

牛客 牛牛做除法II

文章目录1. 题目2. 解题1. 题目 链接&#xff1a;https://ac.nowcoder.com/acm/contest/9715/A 来源&#xff1a;牛客网 牛牛想知道在[0,n]范围中&#xff0c;选取一个最大的数x&#xff0c;满足x % a b&#xff0c;不过这个范围可能会很大&#xff0c;牛牛不知道该如何解决…

【原创】oracle的tpc-c测试及方法

大家好&#xff0c;很高兴来到博客园分享自己的所见所得。希望和大家多多交流&#xff0c;共同进步。 本文重点在于简介使用BenchmarkSQL对oracle进行tpcc的测试步骤&#xff0c;只是一个简单入门的过程。 开源测试工具&#xff1a;BenchmarkSQL。 平台&#xff1a;windows 之前…

牛客 Bang! Bang!(动态规划)

文章目录1. 题目2. 解题1. 题目 链接&#xff1a;https://ac.nowcoder.com/acm/contest/9715/C 来源&#xff1a;牛客网 音游狂热爱好者牛牛接到了一个新的任务&#xff0c;那就是给一张乐谱设计重音符。每当玩家敲击重音符的时候就会发出"bang"的美妙声音!! 每一…

Andorid 反编译App

转载请标明出处&#xff1a;http://blog.csdn.net/lmj623565791/article/details/23564065 开发的过程中&#xff0c;有时候可能会去使用别的app里面的图片&#xff0c;参考布局甚至代码等&#xff0c;但是一般的.apk都是经过代码混淆的&#xff0c;这里分享下使用一些工具进行…

Ubuntu Linux系统下搭建自己的Web服务器

经常被拿来当服务器的有CentOS、Ubuntu......考虑到自己只有Ubuntu的镜像并且只是自己做一些简单的测试使用&#xff0c;所以选择的版本是Ubuntu 14.04 LTS。在这个平台上搭建自己的Web服务器。 相比在Windows下的wamp集成环境&#xff0c;Linux系统下同样有LAMP&#xff0c;不…

天池 在线编程 安排面试城市(贪心)

文章目录1. 题目2. 解题1. 题目 来源&#xff1a;https://tianchi.aliyun.com/oj/210874425247820050/215397455965131520 今天有N个面试者需要面试&#xff0c;公司安排了两个面试的城市A和B&#xff0c;每一个面试者都有到A城市的开销costA和到B城市的开销costB。 公司需要…

天池 在线编程 捡胡萝卜(模拟)

文章目录1. 题目2. 解题1. 题目 来源&#xff1a;https://tianchi.aliyun.com/oj/210874425247820050/215397455965131519 给定一个n * m 的矩阵 carrot, carrot[i][j] 表示(i, j) 坐标上的胡萝卜数量。 从矩阵的中心点出发&#xff0c;每一次移动都朝着四个方向中胡萝卜数量…

VMware中ubuntu虚拟机与windows的端口映射,共享一个IP地址

在ubuntu虚拟机中&#xff0c;运行了meteor的后台程序&#xff0c;需要终端进行连接&#xff0c;需要进行ubuntu虚拟机与windows的端口映射&#xff08;虚拟机与主机共享IP地址&#xff09;。 下面为设置步骤&#xff1a; 1.点击编译&#xff0c;虚拟网络编辑器2.在虚拟网络编辑…

LeetCode 1678. 设计 Goal 解析器

文章目录1. 题目2. 解题1. 题目 请你设计一个可以解释字符串 command 的 Goal 解析器 。 command 由 "G"、"()" 和/或 "(al)" 按某种顺序组成。 Goal 解析器会将 “G” 解释为字符串 “G”、 “()” 解释为字符串 “o” &#xff0c; “(al)” …

Jmeter使用入门

Jmeter简介Jmeter的基本概念百度百科&#xff1a;Apache JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试&#xff0c;它最初被设计用于Web应用测试&#xff0c;但后来扩展到其他测试领域。 它可以用于测试静态和动态资源&#xff0c;例如静态文件、Jav…

阿里云 Windows Server 2022 安装 Docker

阿里云Windows Server 2022 安装 Docker 文章目录 情景尝试正解 安装Docker管理工具安装Docker重启系统配置Docker系统路径配置Docker引擎(也许不用)启动Docker服务 情景 情景&#xff1a;最近一直在搞微服务&#xff0c;团队的服务器是阿里云的 Windows Server 2022&…

LeetCode 1679. K 和数对的最大数目(哈希)

文章目录1. 题目2. 解题1. 题目 给你一个整数数组 nums 和一个整数 k 。 每一步操作中&#xff0c;你需要从数组中选出和为 k 的两个整数&#xff0c;并将它们移出数组。 返回你可以对数组执行的最大操作数。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3,4], k 5 输…

正则表达式之 贪婪与非贪婪模式详解

1 概述 贪婪与非贪婪模式影响的是被量词修饰的子表达式的匹配行为&#xff0c;贪婪模式在整个表达式匹配成功的前提下&#xff0c;尽可能多的匹配&#xff0c;而非贪婪模式在整个表达式匹配成功的前提下&#xff0c;尽可能少的匹配。非贪婪模式只被部分NFA引擎所支持。 属于贪婪…

LeetCode 1680. 连接连续二进制数字(位运算)

文章目录1. 题目2. 解题1. 题目 给你一个整数 n &#xff0c;请你将 1 到 n 的二进制表示连接起来&#xff0c;并返回连接结果对应的 十进制 数字对 10^9 7 取余的结果。 示例 1&#xff1a; 输入&#xff1a;n 1 输出&#xff1a;1 解释&#xff1a;二进制的 "1"…

网页信息抓取进阶 支持Js生成数据 Jsoup的不足之处

转载请标明出处&#xff1a;http://blog.csdn.net/lmj623565791/article/details/23866427 今天又遇到一个网页数据抓取的任务&#xff0c;给大家分享下。 说道网页信息抓取&#xff0c;相信Jsoup基本是首选的工具&#xff0c;完全的类JQuery操作&#xff0c;让人感觉很舒服。但…