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