給定長度分別為 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 的陣列。說明 請盡可能地優化...