[LeetCode][JavaScript]Create Maximum Number
2015-12-27 00:00
831 查看
Create Maximum Number
Given two arrays of lengthmand
nwith digits
0-9representing two numbers. Create the maximum number of length
k <= m + nfrom digits of the two. The relative order of the digits from the same array must be preserved. Return an array of the
kdigits. 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]
https://leetcode.com/problems/create-maximum-number/
意思看了很久...最后返回一个数组太迷惑了,其实是标题的意思,最大的数。
题意是从两个数组中选出k个数字,拼在一起组成的数要最大,还有一个限制是选数字的时候要按数组index顺序。
从第一个数组中取i个数字,组成最大的数,同理从第二个数组中取k - i个数字,合并起来之后结果也是最大的。
最外层循环从0到k,如果i和k - i超过了对应数组的长度,跳过这一轮。
然后分别从两个数组中取i位和k - i位。
从数组中取i位组成的数字最大,这个子问题类似于Remove Duplicate Letters的思路。
贪心,开一个栈,每次都尽量往里塞最大的数,最后这个栈就是结果。
假设需要取n位数字,每一轮入栈前要先维护栈的状态,如果同时满足以下条件就把栈顶的元素弹出:
1. 栈不为空;
2. 栈顶元素小于当前的元素;
3. 栈顶弹出后,后面剩下没处理的子串加上栈的length要够n位,
看这个例子[3,2,1,4,5],n = 3。
前三轮没有疑问,栈里放入3, 2, 1,stack = [3, 2, 1]。
第四轮循环的时候4比3, 2, 1都大,但不能把3, 2, 1都弹出,因为不够3位了,只弹出2个,stack = [3, 4]。
最后5放入栈,stack = [3, 4, 5]。
第3点对应代码中 "stack.length + len - i > n" 这个条件。
分别取得了两个最大的子序列,合并的操作就类似于merge sort。
双指针,一开始都指向0,放入一个大的,指针++,一直做到某一个数组为空,最后把另一个数组中剩下的都放入结果。
要注意可能有相同的数字,此时要看后面的数来决定哪个比较大,举例来说,[6, 1] 和 [6, 7]应该拿[6, 7]中的6。
/** * @param {number[]} nums1 * @param {number[]} nums2 * @param {number} k * @return {number[]} */ var maxNumber = function(nums1, nums2, k) { var i, m, n, result = [], subNum1, subNum2, mergedNum; for(i = 0; i <= k ; i++){ if(i > nums1.length || k - i > nums2.length) continue; subNum1 = maxSubNum(nums1, i); subNum2 = maxSubNum(nums2, k - i); mergedNum = []; for(m = 0, n = 0; m < subNum1.length && n < subNum2.length;){ if(compareNums(subNum1, subNum2, m, n) === 1) mergedNum.push(subNum1[m++]); else mergedNum.push(subNum2[n++]); } while(m < subNum1.length) mergedNum.push(subNum1[m++]); while(n < subNum2.length) mergedNum.push(subNum2[n++]); if(compareNums(mergedNum, result, 0, 0) === 1) result = mergedNum; } return result; function maxSubNum(str, n){ var i, stack = [], len = str.length; for(i = 0; i < len; i++){ while(stack.length > 0 && stack.length + len - i > n && stack[stack.length - 1] < str[i]) stack.pop(); if(stack.length < n) stack.push(str[i]); } return stack; } /** * @return {number} 1 means num1 is larger than num1, the others return -1. */ function compareNums(num1, num2, m, n){ if(num1[m] === undefined) return -1; if(num2 === undefined) return 1; if(num1[m] > num2 ) return 1; if(num2 > num1[m]) return -1; return compareNums(num1, num2, m + 1, n + 1); //num1[m] === num2 } };
相关文章推荐
- js中的innerHTML和outerHTML区别
- js转换金钱为中文单位元、万元、亿元、万亿
- JavaScript中的对象及层级关系、常用函数
- ExtJs设置文本框是否可用
- JSP页面添加当前时间
- javascript之判断专题
- JavaScript:理解parseInt
- JavaScript-----语法
- C#中,JSON字符串转换成对象。
- JS去掉字符串中的空格
- js判断所给的字符串是否为数值
- [LeetCode][JavaScript]Remove Duplicate Letters
- JSON 字符串转换为 JavaScript 对象
- THREEJS阴影效果
- JavaScript中document对象方法整理
- 图---Dijstra
- 图---Dijstra
- HTML JavaScript语法练习
- FORM表单中onclick()、submit()与onsubmit()的问题
- HTML JavaScript练习