mirror of
https://github.com/Kiritow/OJ-Problems-Source.git
synced 2024-03-22 13:11:29 +08:00
Create 321_yzhang6_10.cpp
This commit is contained in:
parent
9e5cb722b2
commit
791fc60b5c
71
LeetCode/321_yzhang6_10.cpp
Normal file
71
LeetCode/321_yzhang6_10.cpp
Normal file
|
@ -0,0 +1,71 @@
|
|||
// 贪心求数组中的最大子数组
|
||||
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;
|
||||
}
|
Loading…
Reference in New Issue
Block a user