leetcode 321. 拼接最大数(单调栈,分治,贪心)
题目链接
https://leetcode-cn.com/problems/create-maximum-number/
思路:
心都写碎了....
也许就是不适合吧....
你是个好人...
class Solution {
public:
//单个子序列的情况 -> 单调栈的思想可以处理
//多个序列的情况,分类讨论,比如第一个序列s 个值,那么必然第二个序列只有k-s个值
vector<int> solve(vector<int> nums,int k){//保留单个序列的k个值
int n=nums.size();
if(k>=n) return nums;
int left=n-k;
vector<int> ans;
for(int i=0;i<nums.size();i++){
while(ans.size() && nums[i]>ans.back() && left){//这里必须严格大于
ans.pop_back();
left--;
}
ans.push_back(nums[i]);
}
while(left && ans.size()) {
ans.pop_back();
left--;
}
return ans;
}
vector<int> merge(vector<int> nums1,vector<int> nums2) {//合并两个有序列表,不对,这两个列表不能保证是有序的
int n=nums1.size(),m=nums2.size();
int i=0,j=0,k=0;
vector<int> ans=vector<int>(n+m,0);
for(int k=0;k<n+m;k++){
ans[k]=max_(nums1,i,nums2,j)?nums1[i++]:nums2[j++];
}
return ans;
}
// bool max_(vector<int> tmp,vector<int> tmp2){//tmp > tmp2
// int n=tmp.size();
// for(int i=0;i<n;i++){
// if(tmp[i]>tmp2[i]) return true;
// else if(tmp[i]<tmp2[i]) return false;
// }
// return false;
// }
bool max_(vector<int> tmp,int i,vector<int> tmp2,int j){//判断tmp >= tmp2 例如:"7" >"67"
int n1=tmp.size(),n2=tmp2.size();
while(i<n1 && j<n2 && tmp[i]==tmp2[j]) {i++;j++;}
return j==n2 || (i<n1 && tmp[i]>tmp2[j]);
}
vector<int> maxNumber(vector<int>& nums1, vector<int>& nums2, int k) {
int n=nums1.size();
int m=nums2.size();//
if(!k) return {};
vector<int> ans=vector<int>(k,0);
if(n==0 && m==0) return ans;
if(n>m) return maxNumber(nums2,nums1,k);
for(int s=max(0,k-m);s<=k && (s<=n);s++){//这里必须从k-m开始
vector<int> res=solve(nums1,s);
vector<int> res2=solve(nums2,k-s);
// for(auto nxt: res2) printf("%d ",nxt);
// printf("\n");
// cout<<"111\n";
vector<int> res3=merge(res,res2);
// for(auto nxt: res3) printf("%d ",nxt);
// printf("\n");
if(res3.size()==k && max_(res3,0,ans,0)) ans=res3;
// for(auto nxt: ans) printf("%d ",nxt);
// printf("\n");
}
return ans;
}
};
leetcode 321. 拼接最大数(单调栈,分治,贪心)的更多相关文章
- Java实现 LeetCode 321 拼接最大数
321. 拼接最大数 给定长度分别为 m 和 n 的两个数组,其元素由 0-9 构成,表示两个自然数各位上的数字.现在从这两个数组中选出 k (k <= m + n) 个数字拼接成一个新的数,要 ...
- Leetcode 321.拼接最大数
拼接最大数 给定长度分别为 m 和 n 的两个数组,其元素由 0-9 构成,表示两个自然数各位上的数字.现在从这两个数组中选出 k (k <= m + n) 个数字拼接成一个新的数,要求从同一个 ...
- LeetCode Monotone Stack Summary 单调栈小结
话说博主在写Max Chunks To Make Sorted II这篇帖子的解法四时,写到使用单调栈Monotone Stack的解法时,突然脑中触电一般,想起了之前曾经在此贴LeetCode Al ...
- [LeetCode]739. 每日温度(单调栈)
题目 根据每日 气温 列表,请重新生成一个列表,对应位置的输入是你需要再等待多久温度才会升高超过该日的天数.如果之后都不会升高,请在该位置用 0 来代替. 例如,给定一个列表 temperatures ...
- 洛谷 P1198 [JSOI2008]最大数——单调栈/线段树
先上一波题目 https://www.luogu.org/problem/P1198 题目要求维护后缀最大值 以及在数列的最后面添加一个数 这道题呢我们有两种做法 1.单调栈 因为只需要维护后缀最大值 ...
- 奇袭(单调栈+分治+桶排)(20190716 NOIP模拟测试4)
C. 奇袭 题目类型:传统 评测方式:文本比较 内存限制:256 MiB 时间限制:1000 ms 标准输入输出 题目描述 由于各种原因,桐人现在被困在Under World(以下简称UW)中,而 ...
- 【TOJ 4493】Remove Digits(单调栈贪心)
描述 Given an N-digit number, you should remove K digits and make the new integer as large as possible ...
- 单调栈&单调队列学习笔记!
ummm,,,都是单调系列就都一起学了算了思想应该都差不多呢qwq 其实感觉这俩没有什么可说的鸭QAQ就是维护一个单调的东西,区别在于单调栈是一段进一段出然后单调队列是一段进另一段出?没了 好趴辣重点 ...
- BZOJ1012: [JSOI2008]最大数maxnumber [线段树 | 单调栈+二分]
1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 8748 Solved: 3835[Submi ...
随机推荐
- Spark-3-调优要点
1 内存调整要点 Memory Tuning,Java对象会占用原始数据2~5倍甚至更多的空间.最好的检测对象内存消耗的办法就是创建RDD,然后放到cache里面去,然后在UI上面看storage的变 ...
- SQL:我为什么慢你心里没数吗?
SQL 语句执行慢的原因是面试中经常会被问到的,对于服务端开发来说也是必须要关注的问题. 在生产环境中,SQL 执行慢是很严重的事件.那么如何定位慢 SQL.慢的原因及如何防患于未然.接下来带着这些问 ...
- openstack高可用集群17-openstack集成Ceph准备
Openstack集成Ceph准备 Openstack环境中,数据存储可分为临时性存储与永久性存储. 临时性存储:主要由本地文件系统提供,并主要用于nova虚拟机的本地系统与临时数据盘,以及存储gla ...
- zabbix学习(一)——LNMP环境搭建及zabbix安装
第一部分:LNMP环境搭建 一.环境说明: OS: centos7.6_x64nginx:nginx-1.16.0php: php-7.1.11mysql:mysql-5.6.44 zabbi ...
- Android 7.0应用之间共享文件
原文首发于微信公众号:躬行之,欢迎关注交流! 开发中经常需要将某个文件向另一个应用程序传递,如图片上传到另一个应用程序.文件在不同存储路径之间的复制粘贴等都需要共享文件,可以这样理解接收文件的应用是在 ...
- js深克隆与浅克隆
定义: 浅克隆: 克隆对象的一层属性, 如果对象还有对象的话,里面的对象没有进行克隆,只是把地址给了别人.也可以理解为只是简单的克隆了躯体,但是没有得到其灵魂: 深克隆:克隆对象的多层属性,对象里面还 ...
- DataTable添加checkbox实现表格数据全选,单选(点选)
Datatables是一款jquery表格插件.它是一个高度灵活的工具,可以将任何HTML表格添加高级的交互功能. 分页,即时搜索和排序 几乎支持任何数据源:DOM, javascript, Ajax ...
- MVC中Autofac的使用
参考博文 https://www.cnblogs.com/liupeng/p/4806184.html https://blog.csdn.net/qq_37214567/article/detail ...
- Selenium switch_to方法
在web应用自动化测试中,点击一个链接或者按钮会打开一个新的浏览器窗口,会出现多个窗口实例.默认情况下的焦点在主窗口(父窗口),如果要对子窗口进行操作,就需要首先切换到子窗口. Selenium We ...
- [leetcode299] 299. Bulls and Cows
public String getHint(String secret, String guess) { /* 判断bull 是通过比较两个字符串的每一位,每次相同就删除该字符出现的次数,因为后边的 ...