题目:
有两个排序的数组,nums1和nums2,将这两个数组合并成新的排序数组,并且放入nums1中。
输入:
nums1 = {4, 5, 7, 10, 0, 0, 0} length1 = 4
nums2 = {3, 6, 11} length2 = 3
输出:
{3, 4, 5, 6, 7, 10, 11}
思路分析:
(1)另外构建一个长度与nums1等长数组nums,将合并后的值放入nums,再将nums拷贝回nums1。空间复杂度O(n)。
(2)有效利用现有空间,可以转换思路从较大值开始比较,便不会覆盖还有用的值。
代码实现:
#include<iostream>
#include<vector>
using namespace std;
void MergeArray(vector<int>& nums1, int length1, vector<int>& nums2, int length2)
{
int pos1 = length1 - 1;
int pos2 = length2 - 1;
int last = nums1.size() - 1;
while (last >= 0) {
if (pos1<0 || pos2>=0 && nums1[pos1]<nums2[pos2]) {
nums1[last--] = nums2[pos2--];
}
else {
nums1[last--] = nums1[pos1--];
}
}
}
int main()
{
vector<int> nums1{ 4,5,7,10,0,0,0 };
vector<int> nums2{ 3,6,11 };
MergeArray(nums1, 4, nums2, 3);
for (int i = 0; i < nums1.size(); ++i)
cout << nums1[i] << " ";
cout << endl;
return 0;
}
箴言录
民无信不立。