LeetCode 321. Create Maximum Number(寻找最大数)
来源:互联网 发布:订货单软件 编辑:程序博客网 时间:2024/05/17 03:49
原题网址:https://leetcode.com/problems/create-maximum-number/
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]
方法:对于长度为k的数字,可以拆分为从nums1中选取i个,从nums2中选取k-i个,枚举i从0~k,然后合并得到一个候选数。注意比较的时候如果两个数字相等,则需要继续比较后面的数字。这道题的关键点有两个:第一是能否想到将问题拆分为等价的子问题,如果不拆分子问题作为一个整体来处理,则需要回溯,第二是注意比较的时候如何处理相等的数字。
public class Solution { private int[] max(int[] nums, int k) { int[] max = new int[k]; for(int i=0, j=0; i<nums.length; i++) { while (j>0 && k-j<nums.length-i && max[j-1]<nums[i]) j--; if (j<k) max[j++] = nums[i]; } return max; } private int[] merge(int[] nums1, int[] nums2) { int[] merged = new int[nums1.length+nums2.length]; for(int i=0, j=0, m=0; m<merged.length; m++) { merged[m] = greater(nums1, i, nums2, j) ? nums1[i++] : nums2[j++]; } return merged; } private boolean greater(int[] nums1, int i, int[] nums2, int j) { while (i<nums1.length && j<nums2.length && nums1[i]==nums2[j]) { i++; j++; } return j==nums2.length || (i<nums1.length && nums1[i]>nums2[j]); } public int[] maxNumber(int[] nums1, int[] nums2, int k) { int[] max = null; for(int i=Math.max(k-nums2.length, 0); i<=Math.min(nums1.length, k); i++) { int[] merged = merge(max(nums1, i), max(nums2, k-i)); if (max == null || greater(merged, 0, max, 0)) max = merged; } return max; }}
另一种实现:
public class Solution { private int[] max(int[] nums, int k) { int[] max = new int[k]; int from = 0; for(int i=0; i<k; i++) { for(int j=from+1; j+(k-i)<=nums.length; j++) { if (nums[j] > nums[from]) from = j; } max[i] = nums[from]; from ++; } return max; } private int[] merge(int[] nums1, int[] nums2) { int[] merged = new int[nums1.length+nums2.length]; for(int i=0, j=0, k=0; k<merged.length; k++) { merged[k] = greater(nums1, i, nums2, j) ? nums1[i++] : nums2[j++]; } return merged; } private boolean greater(int[] nums1, int f1, int[] nums2, int f2) { while (f1 < nums1.length && f2 < nums2.length && nums1[f1] == nums2[f2]) { f1 ++; f2 ++; } return f2 == nums2.length || (f1 < nums1.length && nums1[f1] > nums2[f2]); } public int[] maxNumber(int[] nums1, int[] nums2, int k) { int[] max = null; for(int i=0; i<=k && i<=nums1.length; i++) { int j=k-i; if (j>nums2.length) continue; int[] max1 = max(nums1, i); int[] max2 = max(nums2, j); int[] merged = merge(max1, max2); if (max == null || greater(merged, 0, max, 0)) max = merged; } return max; }}
- LeetCode 321. Create Maximum Number(寻找最大数)
- leetcode oj 321. Create Maximum Number 在两个数组里选k个最大的数
- 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] 321.Create Maximum Number
- leetcode Create Maximum Number
- Create Maximum Number | LeetCode
- leetcode Create Maximum Number
- LeetCode Create Maximum Number
- leetcode - Create Maximum Number
- singleton单例实现
- apache commons io 概述(2016-04-21更新)
- 支持左右侧滑的Drawerlayout及使用基类让Drawerlayout在不同Activity中的显示
- 用Jenkins搭建Android自动打包环境
- Android Material Design新UI控件使用大全 二
- LeetCode 321. Create Maximum Number(寻找最大数)
- 使用Jenkins自动化构建Android和iOS应用
- Java,Android,窥探组合的用法。AndroidUI组合设计模式,Java组合设计模式
- centos 7下搭建wiki系统
- 游戏开发工具介绍
- 织梦dedecms 在会员中心或后台 隐藏特定字段,部分或个别自定义字段的方法
- 观察者模式
- Android SDK Manager 更新代理配置
- 记Android关于.9切图的一点小技巧