摘要:題目鏈接這題就遍歷所有可能的切分點然后和求到最大值,和分別是有個數時候的最大值,和有個數時的最大值。部分比較簡單,來看求最大值的部分。設產生的最大值是,的是,的是?,F在已經選了了個,最大值是,用了個數,現在指向。
321. Create Maximum Number
題目鏈接:https://leetcode.com/problems...
這題就遍歷所有可能的切分點n然后mergenums1[n]和nums2[k-n]求到最大值,nums1[n]和nums2[k-n]分別是nums1有n個數時候的最大值,和nums2有k-n個數時的最大值。merge部分比較簡單,來看求最大值的部分。
設產生的最大值是max,max的size是n,num的size是m。現在已經選了了i個digit,最大值是max[0:i],num用了j個數,現在指向num[j]。那么這就是用stack可以解決的問題了,如果stack的top元素小于num[j]且剩下的digits還夠的話,那就一直pop,然后把num[j]放進棧頂,剩下的digits夠的條件是:m - j >= n - i,所以可以pop的條件也就是:
while(i > 0 && m - j > n - i && num[j] > max[i])
現在來確定切分點n的范圍:0 <= n <= nums1.length并且0 <= k - n <= nums2.length,也就是k - num2.length <= n <= k,所以最后n的范圍是:max(0, k-num2.length) <= n <= min(nums1.length, k)
merge的時候注意,如果兩個array里面當前int相同,要比較它們之后的數字,選大的。
參考:
https://discuss.leetcode.com/...
public class Solution { public int[] maxNumber(int[] nums1, int[] nums2, int k) { int[] global = new int[k]; if(k == 0) return global; for(int n = Math.max(0, k-nums2.length); n <= Math.min(nums1.length, k); n++) { int[] max1 = getLocalMax(nums1, n); int[] max2 = getLocalMax(nums2, k-n); int[] temp = merge(max1, max2); if(greater(temp, 0, global, 0)) global = temp; } return global; } private boolean greater(int[] a, int i, int[] b, int j) { while(i < a.length && j < b.length) { if(a[i] > b[j]) return true; else if(a[i] < b[j]) return false; i++; j++; } // equal is false return i < a.length; } private int[] getLocalMax(int[] num, int n) { int[] res = new int[n]; int m = num.length; int i = 0; for(int j = 0; j < m; j++) { while(i > 0 && m - j > n - i && num[j] > res[i-1]) i--; if(i < n) res[i++] = num[j]; } return res; } private int[] merge(int[] num1, int[] num2) { int n1 = num1.length, n2 = num2.length; int[] res = new int[n1+n2]; int i = 0, j = 0; for(int k = 0; k < res.length; k++) { if(i >= n1) res[k] = num2[j++]; else if(j >= n2) res[k] = num1[i++]; else res[k] = greater(num1, i, num2, j) ? num1[i++] : num2[j++]; } return res; } }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/66696.html
摘要:算法復雜度思路貪心算法,先能組成的數的組合,然后針對每一個組合,考慮每一個數組能夠組成的最大的位或者位數。對不同組合生成的最大數進行比較,得到所能得到的最大的值。代碼的方法去找這個數。 LeetCode[321] Create Maximum Number Given two arrays of length m and n with digits 0-9 representing ...
摘要:題目要求思路和代碼首先采用分治法的思路,我們知道這個數字中,必然有個數組來自,而剩下的個數字必然來自。那么問題變成從中獲取個數,這個數構成的數字最大,且這個數字的相對位置不變。 題目要求 Given two arrays of length m and n with digits 0-9 representing two numbers. Create the maximum numb...
摘要:題目意思從兩個數組中,保持元素相對位置不變的前提下,找到一個長度為的最大數組。我們每次取兩個數組中剩下的最靠前元素里較大的一個。合并之前結果,得到一個長度為的最大數組。三個不同的函數分別用于取,合并,比較。 Given two arrays of length m and n with digits 0-9 representing two numbers. Create the m...
摘要:原型鏈繼承借用構造函數偽造對象,經典繼承無參數有參數組合繼承偽經典繼承無參數有參數寄生組合式繼承引用類型最理想的范式或者可以把函數寫成下面這樣原型式繼承用于共享引用類型的值,與寄生式類似傳統版先定義函數,再繼承版直接用,再繼承省略了定義函數 原型鏈繼承 function Person(){}; Person.prototype = { constructor: Person,...
摘要:二進制和八進制表示法提供了二進制和八進制數值的新的寫法,分別用前綴或和或表示。用來檢查是否為有窮以及是否為這兩個新方法只對數值有效,非數值一律返回。引入了和這兩個常量,用來表示這個范圍的上下限。因為有精度限制,超過的次方的值無法精確表示。 1 二進制和八進制表示法 ES6提供了二進制和八進制數值的新的寫法,分別用前綴0b(或0B)和0o(或0O)表示。 console.log(0b10...
閱讀 3639·2021-11-24 09:38
閱讀 3142·2021-11-15 11:37
閱讀 781·2021-11-12 10:36
閱讀 3547·2021-10-21 09:38
閱讀 3220·2021-09-28 09:36
閱讀 2420·2021-09-22 16:01
閱讀 4986·2021-09-22 15:09
閱讀 1210·2019-08-30 15:55