321. Create Maximum Number 找到两个数组中能合并的k个的最大数
来源:互联网 发布:海典医药软件 编辑:程序博客网 时间:2024/05/16 15:57
Given two arrays of length m
and n
with digits 0-9
representing two numbers. Create the maximum number of length k <= m + n
from digits of the two. The relative order of the digits from the same array must be preserved. Return an array of the k
digits. You should try to optimize your time and space complexity.
Example 1:
nums1 = [3, 4, 6, 5]
nums2 = [9, 1, 2, 5, 8, 3]
k = 5
return [9, 8, 6, 5, 3]
Example 2:
nums1 = [6, 7]
nums2 = [6, 0, 4]
k = 5
return [6, 7, 6, 0, 4]
Example 3:
nums1 = [3, 9]
nums2 = [8, 9]
k = 3
return [9, 8, 9]
解答:
题意:根据两个数组,从中找到部分数组(原先位置序列不变),组合,得到新的数组且最大值
思路:要找到组合的值最大,肯定也要找从一个数组中找的i个数最大,从另一个数组中找的k-i个数组成的数最大。那么i从1~len遍历就行
剩下的问题就是,对于一个数组,怎么去除一个数使得剩下的数最大
1.用栈,遇到大的数就将栈中原来的数取出,再将大的数放入,遇到小的数放进去(对于一个数组取k个数)
2.就是把递增到达后的数前面的数一个个删除,得到每个长度时最大的数(用于对于两个数组进行合并的情况)
这里就是用栈来解决得到最大数
In short we can first solve 2 simpler problem
Create the maximum number of one array
Create the maximum number of two array using all of their digits.
合并的时候注意:
不能用正常合并的思路,否则出现如下错误:
6 7
6 0 4
--> 6 6 7 0 4
正确:6 7 6 0 4
应该是,当遇到两个数相同时,应该判断这个数后面的两个对应的数(7 0 )的大小
代码:
class Solution {public://从数组中找到k个最大的数,用栈的思想vector<int> getmax(vector<int>& nums, int k){ vector<int>res(k,0); int i = 0, j = 0; //i代表nums的位置,j代表res的位置 int n = nums.size(); for(;i < nums.size(); i++){ while(n-i+j > k && j > 0 && res[j-1] < nums[i]) --j; //注意:这里的n-i+j的作用是防止当遍历到nums的最后k-j个位置的数时,不用再弹出了,直接赋值给res就行 if(j < k) res[j++] = nums[i]; } return res;}vector<int> merge(vector<int>res1, vector<int>res2){ int i = 0, j = 0, k = 0; vector<int>res(res1.size() + res2.size(), 0); while(i < res1.size() && j < res2.size()){ if(greaters(res1, i, res2, j)) res[k++] = res1[i++]; else res[k++] = res2[j++]; } while(i < res1.size()) res[k++] = res1[i++]; while(j < res2.size()) res[k++] = res2[j++]; return res;}bool greaters(vector<int>res, int i, vector<int>ans, int j){ while(i < res.size() && j < ans.size() && res[i] ==ans[j]){ ++i; ++j; } return (j == ans.size() || (i < res.size() && j < ans.size() && res[i] > ans[j])); }vector<int> maxNumber(vector<int>& nums1, vector<int>& nums2, int k) { int len1 = nums1.size(); int len2 = nums2.size(); vector<int>ans(k, 0); for(int i = max(0, k - len2); i <= min(len1, k); i++){ //取的个数 vector<int> nums_max1 = getmax(nums1, i); vector<int> nums_max2 = getmax(nums2, k-i); vector<int>res = merge(nums_max1, nums_max2); if(greaters(res, 0, ans, 0)) ans = res; } return ans;}};
- 321. Create Maximum Number 找到两个数组中能合并的k个的最大数
- leetcode oj 321. Create Maximum Number 在两个数组里选k个最大的数
- 两个序列组合成最大的数Create Maximum Number
- leetcode 321. Create Maximum Number 根据两个整数创造一个最大的数
- 在一个数组中找到最大的两个数
- leetcode笔记—生成最大的 数组Create Maximum Number
- 找出数组中第K个最大的数
- ms 两个数组,从每个数组中取一个数相加,求最大的前k个和
- 找到数组中最大的数!
- N个降序数组,找到最大的K个数
- N个降序数组,找到最大的K个数
- LeetCode 321. Create Maximum Number(寻找最大数)
- 在两个有序数组中找到第k小的数
- 在两个排序数组中找到第k小的数
- 其他题目---在两个排序数组中找到第K小的数
- 260. Single Number III (找到数组中仅出现一次的两个数)
- 在一个无序数组中找到第K个最小或者最大的元素
- 在一个数组中找到前k个小(大)的数
- 求Sn=a+aa+aaa+aaaa+aaaaa+...的前n项之和
- matlab和Python线性规划
- Android基础知识【chapter-4】Activity和Intent
- 插件开发之360 DroidPlugin源码分析(二)Hook机制
- 图论欧拉回路初步 & BZOJ2095 POI2010 Bridges
- 321. Create Maximum Number 找到两个数组中能合并的k个的最大数
- 无线app登录拦截器
- bzoj2821 作诗
- HashMap总结
- MySQL启动时报错:ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/my
- Struts2拦截器的使用 (详解)
- C语言学习笔记 lesson18 字符串处理函数
- Mean Average Precision(MAP)
- asp.net技术生成二维码