leetcode 321 Create Max Number
leetcode 321 Create Max Number
greedy的方法,由于有两个数组,我们很自然的想到从数组1中选i个数,数组2中选k-i个数,这样我们只需要遍历max(0, k-数组2长度n) ~ 数组1长度,然后保存合并i和k-i这两个部分之后得到的最大值即可。 那么还剩下这几个问题:
1) 从一个数组中不改变元素顺序地选出i个元素,使他们顺序排列代表的十进制数最大。例:[1,4,3,6,2], i = 3, 结果为[4,6,2]
2) 如何合并数组1的i个元素和数组2的k-i个元素
3) 比较两个数组所代表的十进制数的大小
第一个问题,我们需要使用栈的概念,遍历数组,每次比较栈顶元素与当前元素i,若i比栈顶元素大,则pop栈顶,继续比较,直到栈空或者i比栈顶元素小。注意,我们还需要时刻检测,i之后的元素是否足够补上pop出栈的空缺,若不够则不能再pop。例:[1,4,3,6,2], 当index为3时,栈中有[4,3],6和3比,大于,弹出3,继续比4,大于,这时候却不能弹出4,因为6后面只有一个数,不够补上pop2次的空缺。
第二个问题,分别用两个index i, j指向数组1和2,比较他们指向的元素,将大的元素放入新的大小为k的数组。注意,如何比较呢?可能指向元素相等,可能某一个数组已经到头了。详细过程在第三个问题列出
第三个问题,如何比较?本题有两个地方需要使用比较,第一个就是主函数中比较不同i值导致的不同长度为k的数组,这个较为简单,因为两个数组长度一致,只需要用两个index,i,j分别遍历两个数组即可,返回nums1[i]和nums2[j]中较大的那一个,若相等则i++,j++,若i=j=k-1还是相等,说明两个数组代表的十进制数相同,返回哪一个都可以。第二个地方就是上一个问题中提到的,比较两个index指向元素的大小,一部分与之前解法相同,元素相等就继续比较后面的元素,不过有一点需要区别的,这里的两个数组可能是不同长度的,所以有可能i或j中某一个指向的位置没有数组元素,即这个数组已经到头了,这种情况,显然就可以返回另一个数组的index指向的元素。
代码如下:
class Solution {
public int[] maxNumber(int[] nums1, int[] nums2, int k) {
int len1 = nums1.length, len2 = nums2.length;
int[] res = new int[k];
for(int i=0; i<=k; i++){
if((k - i) <= len2 && i <= len1){
int[] tmp = new int[k];
tmp = merge(singleNum(nums1, i), singleNum(nums2, k-i));
if(compare(tmp, 0, res, 0))
res = tmp;
}
}
return res;
}
public int[] singleNum(int[] nums, int k){
int len = nums.length;
int[] res = new int[k];
int j = 0;
for(int i=0; i<len; i++){
while(len-i+j > k && j > 0 && res[j-1] < nums[i])
j--;
if(j < k)
res[j++] = nums[i];
}
return res;
}
public int[] merge(int[] nums1, int[] nums2){
int k = nums1.length + nums2.length;
int[] res = new int[k];
for(int i=0, j=0, idx = 0; idx < k; idx++){
res[idx] = compare(nums1, i, nums2, j) ? nums1[i++] : nums2[j++];
}
return res;
}
private boolean compare(int[] nums1, int idx1, int[] nums2, int idx2){
while(idx1 < nums1.length && idx2 < nums2.length && nums1[idx1] == nums2[idx2]){
idx1++;
idx2++;
}
return idx2 == nums2.length || (idx1 < nums1.length && nums1[idx1] > nums2[idx2]);
}
}
leetcode 321 Create Max Number的更多相关文章
- [LeetCode] 321. Create Maximum Number 创建最大数
Given two arrays of length m and n with digits 0-9 representing two numbers. Create the maximum numb ...
- LeetCode 321. Create Maximum Number
原题链接在这里:https://leetcode.com/problems/create-maximum-number/description/ 题目: Given two arrays of len ...
- leetcode 402. Remove K Digits 、321. Create Maximum Number
402. Remove K Digits https://www.cnblogs.com/grandyang/p/5883736.html https://blog.csdn.net/fuxuemin ...
- 402. Remove K Digits/738.Monotone Increasing Digits/321. Create Maximum Number
Given a non-negative integer num represented as a string, remove k digits from the number so that th ...
- 321. Create Maximum Number 解题方法详解
321. Create Maximum Number 题目描述 Given two arrays of length m and n with digits 0-9 representing two ...
- 321. Create Maximum Number
/* * 321. Create Maximum Number * 2016-7-6 by Mingyang */ public int[] maxNumber(int[] nums1, int[] ...
- 321. Create Maximum Number (c++ ——> lexicographical_compare)
Given two arrays of length m and n with digits 0-9 representing two numbers. Create the maximum numb ...
- 321 Create Maximum Number 拼接最大数
已知长度分别为 m 和 n 的两个数组,其元素由 0-9 构成,直观地表示两个自然数各位上的数字.现在从这两个数组中选出 k (k <= m + n) 个数字拼接成一个新的数,要求从同一个数组中 ...
- [LintCode] Create Maximum Number 创建最大数
Given two arrays of length m and n with digits 0-9 representing two numbers. Create the maximum numb ...
随机推荐
- java笔试之简单密码
密码是我们生活中非常重要的东东,我们的那么一点不能说的秘密就全靠它了.哇哈哈. 接下来渊子要在密码之上再加一套密码,虽然简单但也安全. 假设渊子原来一个BBS上的密码为zvbo9441987,为了方便 ...
- sparkJavaApi逐个详解
说明:掌握spark的一个关键,就是要深刻理解掌握RDD各个函数的使用场景,这样我们在写业务逻辑的时候就知道在什么时候用什么样的函数去实现,得心应手,本文将逐步收集整理各种函数原理及示例代码,持续更新 ...
- iOS开发系列-NSURLSession
概述 NSURLSession是从iOS7开始出现的.NSURLSession比NSURLConnection简单很多并且避免了很多坑,因此目前公司项目大部分由NSURLConnection过度为NS ...
- winform 旋转图片
//img.RotateFlip(RotateFlipType.Rotate90FlipNone); //顺时针旋转90度 RotateFlipType.Rotate90FlipNone //逆时针旋 ...
- NBIS指纹特征提取与匹配软件使用
1. docker 创建虚拟centos 环境 2. docker 安装wget 工具 3.wget下载源代码 wget http://nigos.nist.gov:8080/nist/nbis/nb ...
- Python-基本运算符与流程控制
目录 基本运算符 算术运算符 比较运算符 赋值运算符 逻辑运算符 身份运算符 位运算符 成员运算符 运算符优先级 流程控制 if 判断 单分支结构 双分支结构 多分支结构 while 循环 while ...
- splay区间翻转
原题P3391 [模板]文艺平衡树(Splay) 题目背景 这是一道经典的Splay模板题——文艺平衡树. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: ...
- ES6数组对象新增方法
1. Array.from() Array.from方法用于将两类对象转为真正的数组:类数组的对象( array-like object )和可遍历( iterable )的对象(包括 ES6 新增的 ...
- 我能不能理解成 ssh中service就相当于与jsp+servlet+dao中的servlet???
转文 首先解释面上意思,service是业务层,dao是数据访问层.(Data Access Objects) 数据访问对象 1.Dao其实一般没有这个类,这一般是指java中MVC架构中的model ...
- HDU--2602(0-1背包)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2602 分析:一个0-1背包问题.记得<背包九讲>的方法. dp[j]=max{dp[j],d ...