1. 題目
合併兩個有序數組
假設nums1有足夠的空間(>=m+n)來保存nums2中的附加元素
2. 分析
採用歸併排序的思想
1:兩數組都有序,所以按順序比較大小即可。
建立一個長度爲m+n的total數組,逐個比較nums1、nums2數組中的元素,
先將較小元素放入total,再考慮兩數組剩餘元素,
最後再把total的元素重新賦值到A數組中。
2:由於nums1有足夠空間,所以可以從後到前遍歷,無須開闢新數組
3. 代碼
1)
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
if(m < 0 || n < 0)
return;
int len = m + n;
int *total = new int[len];
int i = 0, j = 0, k = 0;
while(i < m && j <n)
{
if(nums1[i] <= nums2[j])
{
total[k++] = nums1[i++];
}
else
{
total[k++] = nums2[j++];
}
}
while(i < m)
{
total[k++] = nums1[i++];
}
while(j < n)
{
total[k++] = nums2[j++];
}
for(int p = 0; p < len; ++p)
nums1[p] = total[p];
}
};
2)
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
if(m < 0 || n < 0)
return;
int k = m + n - 1;
--m;
--n;
while(m >= 0 && n >= 0)
{
if(nums1[m] > nums2[n])
nums1[k--] = nums1[m--];
else
nums1[k--] = nums2[n--];
}
while(n >= 0)
nums1[k--] = nums2[n--];
return;
}
};