給定長度分別為 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]
單個序列取k個最大的序列可以利用棧的思想,棧頂小於當前的元素就出棧,直到棧頂元素大於當前元素就把當前元素入棧。
class solution
int m = nums1.size() - k;
if (k == 0)
for (int i = 0; i < nums1.size(); i++)
out.push_back(nums1[i]);
} return std::vector(out.begin(), out.begin() + k); }
bool bcombigger(const std::vector&sq1, const std::vector&sq2)
else if (sq1[i] < sq2[i])
}if (sq1.size() < sq2.size())
return false;
} bool bcombiggerorg(const std::vector&sq1, const std::vector&sq2)
else if (sq1.size() > sq2.size())
for (int i = 0; i < sq1.size(); i++)
else if (sq1[i] < sq2[i])
}return false;
} vectormerge(const vector& nums1, const vector& nums2)
else if (nums1[i] < nums2[j])
else
else
}} while (i < nums1.size())
while (j < nums2.size())
return out;
} vectormaxnumber(vector& nums1, vector& nums2, int k)
} return out;
}};
letecode 程式設計學習(4)
題目 給定乙個整數陣列和乙個區間,計算有多少連續子陣列的和在區間範圍內 例如 陣列 3,0,5,2,2 區間為 1,3 則輸出的子陣列有 3 2,2 3,0 3,0,5,2,2 這5種,輸出為5。include include include include includestruct treeno...
letecode 程式設計學習(7)
題目奇偶鍊錶 給定乙個單鏈表,把所有的奇數節點和偶數節點分別排在一起。請注意,這裡的奇數節點和偶數節點指的是節點編號的奇偶性,而不是節點的值的奇偶性。請嘗試使用原地演算法完成。你的演算法的空間複雜度應為 o 1 時間複雜度應為 o nodes nodes 為節點總數。示例 1 輸入 1 2 3 4 ...
letecode 程式設計學習(12)
題目 在一條環路上有 n 個加油站,其中第 i 個加油站有汽油 gas i 公升。你有一輛油箱容量無限的的汽車,從第 i 個加油站開往第 i 1 個加油站需要消耗汽油 cost i 公升。你從其中的乙個加油站出發,開始時油箱為空。如果你可以繞環路行駛一周,則返回出發時加油站的編號,否則返回 1。說明...