mirror of
https://github.com/Kiritow/OJ-Problems-Source.git
synced 2024-03-22 13:11:29 +08:00
72 lines
2.1 KiB
C++
72 lines
2.1 KiB
C++
|
// 贪心求数组中的最大子数组
|
|||
|
vector<int> findMaxKValue(vector<int> &nums, int k)
|
|||
|
{
|
|||
|
vector<int> result;
|
|||
|
if (k == 0)
|
|||
|
return result;
|
|||
|
result = vector<int>(k, 0);
|
|||
|
int j = 0;
|
|||
|
int n = nums.size();
|
|||
|
for (int i = 0; i < n; i++)
|
|||
|
{
|
|||
|
// 出栈操作
|
|||
|
while (j > 0 && n - i + j > k && nums[i] > result[j - 1])
|
|||
|
j--;
|
|||
|
// 入栈操作
|
|||
|
if (j < k)
|
|||
|
result[j++] = nums[i];
|
|||
|
}
|
|||
|
return result;
|
|||
|
}
|
|||
|
// merge操作中的对比函数
|
|||
|
bool compare(vector<int> &result1, int i, vector<int> &result2, int j)
|
|||
|
{
|
|||
|
while (i < result1.size() && j < result2.size() && result1[i] == result2[j])
|
|||
|
{
|
|||
|
i++;
|
|||
|
j++;
|
|||
|
}
|
|||
|
return j == result2.size() || (i < result1.size() && result1[i] > result2[j]);
|
|||
|
}
|
|||
|
// 两个数组的merge操作
|
|||
|
vector<int> merge(vector<int> &nums1, vector<int> &nums2)
|
|||
|
{
|
|||
|
int m = nums1.size();
|
|||
|
int n = nums2.size();
|
|||
|
if (!m)
|
|||
|
return nums2;
|
|||
|
if (!n)
|
|||
|
return nums1;
|
|||
|
vector<int> result(m + n, 0);
|
|||
|
int i = 0;
|
|||
|
int j = 0;
|
|||
|
int k = 0;
|
|||
|
// 数组合并操作
|
|||
|
while (i < m || j < n)
|
|||
|
{
|
|||
|
result[k++] = compare(nums1, i, nums2, j) ? nums1[i++] : nums2[j++];
|
|||
|
}
|
|||
|
return result;
|
|||
|
}
|
|||
|
// 返回两个数组中最大的k个数,并保持每个数组中的元素相对位置不变
|
|||
|
vector<int> maxNumber(vector<int> &nums1, vector<int> &nums2, int k)
|
|||
|
{
|
|||
|
int m = nums1.size();
|
|||
|
int n = nums2.size();
|
|||
|
vector<int> result(k, 0);
|
|||
|
// 从数组nums中挑选k个数,在保持元素相对顺序不变的情况下,使得选出的子数组最大化。
|
|||
|
for (int i = max(0, k - n); i <= min(m, k); i++)
|
|||
|
{
|
|||
|
// 在数组nums1中挑选i个数
|
|||
|
vector<int> result1 = findMaxKValue(nums1, i);
|
|||
|
// 在数组nums2中挑选k-i个数
|
|||
|
vector<int> result2 = findMaxKValue(nums2, k - i);
|
|||
|
// 将两个挑选出的子数组进行合并
|
|||
|
vector<int> temp = merge(result1, result2);
|
|||
|
// 比较大小,来判断是否更新数组
|
|||
|
if (compare(temp, 0, result, 0))
|
|||
|
result = temp;
|
|||
|
}
|
|||
|
return result;
|
|||
|
}
|