leetcode 321. Create Maximum Number 根据两个整数创造一个最大的数
来源:互联网 发布:网络诈骗八千 编辑:程序博客网 时间:2024/06/04 05:20
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]
这道题,说实话,我自己肯定想不出来的,这是网上看的做法。
代码如下:
import java.util.Arrays;import java.util.Stack;/* * 这个题也需要反思,贪心算法 * http://blog.csdn.net/yzhang6_10/article/details/51367533 * http://blog.csdn.net/zly9923218/article/details/51014902 * 1)分别从nums1(长度为m)和nums2(长度为n)中挑选出i(max(0, k - n) <= i <= min(m, k) 和k-i个数, * 在保持挑选数组的元素相对顺序不变的情况下,使选出的子数组最大化,主要利用贪心算法进行选取; * 2)在保持元素相对位置不变的前提下,将数组nums1与nums2合并,使合并的数组最大化。 * */class Solution { public int[] maxNumber(int[] nums1, int[] nums2, int k) { int[] result=new int[k]; Arrays.fill(result, 0); if(nums1==null || nums2==null) return result; //根据 k-i<=nums2.length && k-i>=0 推导出来的 for(int i=Math.max(0, k-nums2.length); i<=k && i<=nums1.length;i++) { int[] result1 = findKMaxNum(nums1,i); int[] result2 = findKMaxNum(nums2,k-i); int a=0,b=0,c=0; int[] tmp=new int[k]; //归并 while(a<result1.length || b<result2.length) tmp[c++] = cmp(result1,a,result2,b)? result1[a++] : result2[b++]; if(cmp(tmp,0,result,0)) result=tmp; } return result; } //比较 private boolean cmp(int[] num1, int i, int[] num2, int j) { for(;i<num1.length && j<num2.length;i++,j++) { if(num1[i]>num2[j]) return true; else if(num1[i]<num2[j]) return false; } //这个是为了考虑到越界的情况 if(i<num1.length) return true; else return false; } /* * 使用栈得到最大的k个值,同时要保留相关的次序 * 这里是使用数组模拟栈 */ public int[] findKMaxNum1(int[] nums, int k) { int[] reslut=new int[k]; int size=0; for(int i=0;i<nums.length;i++) { while(size>0 && nums.length-i > k-size && reslut[size-1]<nums[i]) size--; if(size<k) reslut[size++]=nums[i]; } return reslut; } /* * 这是使用栈来实现 * */ public int[] findKMaxNum(int[] nums, int k) { int[] reslut=new int[k]; Stack<Integer> stack=new Stack<>(); for(int i=0;i<nums.length;i++) { while(stack.isEmpty()==false && nums.length-i > k-stack.size() && stack.peek()<nums[i]) stack.pop(); if(stack.size()<k) stack.push(nums[i]); } for(int i=reslut.length-1;i>=0;i--) reslut[i]=stack.pop(); return reslut; }}
阅读全文
0 0
- leetcode 321. Create Maximum Number 根据两个整数创造一个最大的数
- leetcode oj 321. Create Maximum Number 在两个数组里选k个最大的数
- 两个序列组合成最大的数Create Maximum Number
- LeetCode 321. Create Maximum Number(寻找最大数)
- 321. Create Maximum Number 找到两个数组中能合并的k个的最大数
- leetcode笔记—生成最大的 数组Create Maximum Number
- leetcode 321. Create Maximum Number
- LeetCode 321. Create Maximum Number
- LeetCode-321. Create Maximum Number
- leetcode.321. Create Maximum Number
- [LeetCode]321. Create Maximum Number
- Leetcode-321. Create Maximum Number
- [LeetCode]321. Create Maximum Number
- LeetCode 321. Create Maximum Number
- Leetcode 321. Create Maximum Number
- [Leetcode] 321.Create Maximum Number
- leetcode Create Maximum Number
- Create Maximum Number | LeetCode
- 1044. 火星数字(20)
- LeetCode 64. Minimum Path Sum
- poj 3261 Milk Patterns(刷题)
- Qt中将一张图片剪裁成圆形图显示
- 一张几亿的分区表,能改名么?
- leetcode 321. Create Maximum Number 根据两个整数创造一个最大的数
- UBOOT源码详解之BL2第二阶段
- 首字母变大写
- LinuxStudyNote(39)-Linux软件包管理(1)-Linux软件包简介之源码包与RPM包、源码包的优缺点、RPM二进制包的优缺点
- Oracle 12c CC安装碰见的认证问题
- Spring源码研究之注解扫描<context:component-scan/>
- python循环
- 国庆中秋活动——让孩子亲近数学并爱上数学:《数学小侦探》来袭(来自科大出版社的福利)
- sicily1000. 词法分析程序设计 **