leetcodeSolution to some Leetcode problems written in C++ |
git clone git://git.dimitrijedobrota.com/leetcode.git |
Log | Files | Refs | README | LICENSE |
0321.cpp (1319B)
0 class Solution {
1 static bool greater(const vector<int> &nums1, const vector<int> &nums2, int i, int j) {
2 while (i < size(nums1) && j < size(nums2) && nums1[i] == nums2[j])
3 i++, j++;
4 return j == size(nums2) || (i < size(nums1) && nums1[i] > nums2[j]);
5 }
7 static vector<int> merge(const vector<int> &nums1, const vector<int> &nums2, int k) {
8 vector<int> res(k);
10 for (int i = 0, j = 0, l = 0; l < k; l++) {
11 res[l] = greater(nums1, nums2, i, j) ? nums1[i++] : nums2[j++];
12 }
14 return res;
15 }
17 static vector<int> maxArr(const vector<int> &nums, int k) {
18 const int n = size(nums);
19 vector<int> res(k);
21 for (int i = 0, j = 0; i < n; i++) {
22 while (n - i + j > k && j > 0 && res[j - 1] < nums[i])
23 j--;
24 if (j < k) res[j++] = nums[i];
25 }
27 return res;
28 }
30 public:
31 vector<int> maxNumber(const vector<int> &nums1, const vector<int> &nums2, int k) const {
32 const int n = size(nums1), m = size(nums2);
33 vector<int> res(k);
35 for (int i = max(0, k - m); i <= k && i <= n; i++) {
36 const auto candid = merge(maxArr(nums1, i), maxArr(nums2, k - i), k);
37 res = max(res, candid);
38 }
40 return res;
41 }
42 };