LeetCode321 拼接最大數

2021-09-24 21:37:21 字數 3560 閱讀 1477

給定長度分別為 m 和 n 的兩個陣列,其元素由 0-9 構成,表示兩個自然數各位上的數字。現在從這兩個陣列中選出 k (k <= m + n) 個數字拼接成乙個新的數,要求從同乙個陣列中取出的數字保持其在原陣列中的相對順序。

求滿足該條件的最大數。結果返回乙個表示該最大數的長度為 k 的陣列。

說明: 請盡可能地優化你演算法的時間和空間複雜度。

示例 1:

輸入:nums1 = [3, 4, 6, 5]

nums2 = [9, 1, 2, 5, 8, 3]

k = 5

輸出:[9, 8, 6, 5, 3]

示例 2:

輸入:nums1 = [6, 7]

nums2 = [6, 0, 4]

k = 5

輸出:[6, 7, 6, 0, 4]

示例 3:

輸入:nums1 = [3, 9]

nums2 = [8, 9]

k = 3

輸出:[9, 8, 9]

看到這道題,原以為很簡單,依次選,選大的就好啊,但是當兩邊一樣大的時候,就糾結了,然後用了乙個方法,超時。有用了乙個方法,記憶體超了。

最後突然有了靈感,如果選500個數,那就可能0+500,1+499,2+498…

而這時候只要考慮兩個小演算法就行,第乙個就是在陣列內找到指定長度的最大值。第二個就是拼接兩個值成最大值

答案:

public int maxnumber(int nums1, int nums2, int k) 

if (nums2.length < k - i || i > nums1.length)

int ans1 = getf(nums1, i);

int ans2 = getf(nums2, k - i);

int anss = getff(ans1, ans2);

if (ans == null || lager(anss, ans))

}return ans;

}//拼接兩個陣列

private int getff(int ans1, int ans2) else if (i == ans1.length) else else }}

return ans;

}//nums1陣列中最大的num位值

private int getf(int nums1, int num)

int key = -1;

for (int i = 0; i < nums1.length; i++)

if (key == -1 || nums1[i] <= ans[key])

ans[++key] = nums1[i];

} else

}return ans;

}private boolean lager(int an1, int an2) else if (an1[i] < an2[i])

}return false;

}private boolean lager(int an1, int an2, int sta1, int sta2) else if (an1[i + sta1] < an2[i + sta2])

}if (i + sta2 == an2.length)

return false;

}

附加:

超時演算法:

class solution 

private void maxnum(int nums1, int sta1, int nums2, int sta2, int key, int k, boolean canh)

if (canh)

int temp1 = ans[key] - 1;

int st1 = -1;

for (int i = sta1; i < nums1.length && i <= (nums1.length + nums2.length) - (sta2 + (k - key)); i++)

}int st2 = -1;

int temp2 = ans[key] - 1;

for (int i = sta2; i < nums2.length && i <= (nums1.length + nums2.length) - (sta1 + (k - key)); i++)

}if (temp1 > temp2) else if (temp1 == ans[key]) else

return;

}if (temp1 < temp2) else if (temp2 == ans[key]) else

return;

}if (temp1 < ans[key]) else if (temp1 == ans[key]) else

canh = false;

if (temp2 < ans[key]) else if (temp2 == ans[key]) else

}}

超記憶體演算法:

class solution 

boolean bbb;

int anss;

private int maxnum(int nums1, int sta1, int nums2, int sta2, int key, int k)

if (bbb[sta1][sta2])

bbb[sta1][sta2] = true;

int temp1 = -1;

int st1 = -1;

for (int i = sta1; i < nums1.length && i <= (nums1.length + nums2.length) - (sta2 + (k - key)); i++)

}int st2 = -1;

int temp2 = -1;

for (int i = sta2; i < nums2.length && i <= (nums1.length + nums2.length) - (sta1 + (k - key)); i++)

}if (temp1 > temp2)

anss[sta1][sta2] = ann;

return ann;

}if (temp1 < temp2)

anss[sta1][sta2] = ann;

return ann;

}int an1 = maxnum(nums1, st1 + 1, nums2, sta2, key + 1, k);

int an2 = maxnum(nums1, sta1, nums2, st2 + 1, key + 1, k);

if (lager(an1, an2))

anss[sta1][sta2] = ann;

return ann;

} else

anss[sta1][sta2] = ann;

return ann;}}

private boolean lager(int an1, int an2) else if (an1[i] < an2[i])

}return false;

}}

leetcode321 拼接最大數

給定長度分別為 m 和 n 的兩個陣列,其元素由 0 9 構成,表示兩個自然數各位上的數字。現在從這兩個陣列中選出 k k m n 個數字拼接成乙個新的數,要求從同乙個陣列中取出的數字保持其在原陣列中的相對順序。求滿足該條件的最大數。結果返回乙個表示該最大數的長度為 k 的陣列。說明 請盡可能地優化...

leetcode 321 拼接最大數

目錄 一 題目內容 二 解題思路 三 給定長度分別為 m 和 n 的兩個陣列,其元素由 0 9 構成,表示兩個自然數各位上的數字。現在從這兩個陣列中選出 k k m n 個數字拼接成乙個新的數,要求從同乙個陣列中取出的數字保持其在原陣列中的相對順序。求滿足該條件的最大數。結果返回乙個表示該最大數的長...

Leetcode 321 拼接最大數

給定長度分別為 m 和 n 的兩個陣列,其元素由 0 9 構成,表示兩個自然數各位上的數字。現在從這兩個陣列中選出 k k m n 個數字拼接成乙個新的數,要求從同乙個陣列中取出的數字保持其在原陣列中的相對順序。求滿足該條件的最大數。結果返回乙個表示該最大數的長度為 k 的陣列。說明 請盡可能地優化...