摘要:題目鏈接這題就遍歷所有可能的切分點(diǎn)然后和求到最大值,和分別是有個(gè)數(shù)時(shí)候的最大值,和有個(gè)數(shù)時(shí)的最大值。部分比較簡(jiǎn)單,來看求最大值的部分。設(shè)產(chǎn)生的最大值是,的是,的是?,F(xiàn)在已經(jīng)選了了個(gè),最大值是,用了個(gè)數(shù),現(xiàn)在指向。
321. Create Maximum Number
題目鏈接:https://leetcode.com/problems...
這題就遍歷所有可能的切分點(diǎn)n然后mergenums1[n]和nums2[k-n]求到最大值,nums1[n]和nums2[k-n]分別是nums1有n個(gè)數(shù)時(shí)候的最大值,和nums2有k-n個(gè)數(shù)時(shí)的最大值。merge部分比較簡(jiǎn)單,來看求最大值的部分。
設(shè)產(chǎn)生的最大值是max,max的size是n,num的size是m?,F(xiàn)在已經(jīng)選了了i個(gè)digit,最大值是max[0:i],num用了j個(gè)數(shù),現(xiàn)在指向num[j]。那么這就是用stack可以解決的問題了,如果stack的top元素小于num[j]且剩下的digits還夠的話,那就一直pop,然后把num[j]放進(jìn)棧頂,剩下的digits夠的條件是:m - j >= n - i,所以可以pop的條件也就是:
while(i > 0 && m - j > n - i && num[j] > max[i])
現(xiàn)在來確定切分點(diǎn)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的時(shí)候注意,如果兩個(gè)array里面當(dāng)前int相同,要比較它們之后的數(shù)字,選大的。
參考:
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; } }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/66696.html
摘要:算法復(fù)雜度思路貪心算法,先能組成的數(shù)的組合,然后針對(duì)每一個(gè)組合,考慮每一個(gè)數(shù)組能夠組成的最大的位或者位數(shù)。對(duì)不同組合生成的最大數(shù)進(jìn)行比較,得到所能得到的最大的值。代碼的方法去找這個(gè)數(shù)。 LeetCode[321] Create Maximum Number Given two arrays of length m and n with digits 0-9 representing ...
摘要:題目要求思路和代碼首先采用分治法的思路,我們知道這個(gè)數(shù)字中,必然有個(gè)數(shù)組來自,而剩下的個(gè)數(shù)字必然來自。那么問題變成從中獲取個(gè)數(shù),這個(gè)數(shù)構(gòu)成的數(shù)字最大,且這個(gè)數(shù)字的相對(duì)位置不變。 題目要求 Given two arrays of length m and n with digits 0-9 representing two numbers. Create the maximum numb...
摘要:題目意思從兩個(gè)數(shù)組中,保持元素相對(duì)位置不變的前提下,找到一個(gè)長度為的最大數(shù)組。我們每次取兩個(gè)數(shù)組中剩下的最靠前元素里較大的一個(gè)。合并之前結(jié)果,得到一個(gè)長度為的最大數(shù)組。三個(gè)不同的函數(shù)分別用于取,合并,比較。 Given two arrays of length m and n with digits 0-9 representing two numbers. Create the m...
摘要:原型鏈繼承借用構(gòu)造函數(shù)偽造對(duì)象,經(jīng)典繼承無參數(shù)有參數(shù)組合繼承偽經(jīng)典繼承無參數(shù)有參數(shù)寄生組合式繼承引用類型最理想的范式或者可以把函數(shù)寫成下面這樣原型式繼承用于共享引用類型的值,與寄生式類似傳統(tǒng)版先定義函數(shù),再繼承版直接用,再繼承省略了定義函數(shù) 原型鏈繼承 function Person(){}; Person.prototype = { constructor: Person,...
摘要:二進(jìn)制和八進(jìn)制表示法提供了二進(jìn)制和八進(jìn)制數(shù)值的新的寫法,分別用前綴或和或表示。用來檢查是否為有窮以及是否為這兩個(gè)新方法只對(duì)數(shù)值有效,非數(shù)值一律返回。引入了和這兩個(gè)常量,用來表示這個(gè)范圍的上下限。因?yàn)橛芯认拗?,超過的次方的值無法精確表示。 1 二進(jìn)制和八進(jìn)制表示法 ES6提供了二進(jìn)制和八進(jìn)制數(shù)值的新的寫法,分別用前綴0b(或0B)和0o(或0O)表示。 console.log(0b10...
閱讀 3688·2021-11-24 09:38
閱讀 3161·2021-11-15 11:37
閱讀 803·2021-11-12 10:36
閱讀 3562·2021-10-21 09:38
閱讀 3234·2021-09-28 09:36
閱讀 2438·2021-09-22 16:01
閱讀 5015·2021-09-22 15:09
閱讀 1237·2019-08-30 15:55