題目
給你兩個有序整數數組 nums1 和 nums2,請你將 nums2 合併到 nums1 中,使 nums1 成爲一個有序數組。
說明:
- 初始化 nums1 和 nums2 的元素數量分別爲 m 和 n 。
- 你可以假設 nums1 有足夠的空間(空間大小大於或等於 m + n)來保存 nums2 中的元素。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/merge-sorted-array
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
輸入:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6], n = 3
輸出: [1,2,2,3,5,6]
解答
方法一:
第一個想法就是兩個數組都拿出自己的元素進行對比,對比之後放到一個臨時空間裏。最後把臨時空間的數據拷貝到nums1裏邊。
這個需要考慮一個問題就是循環的次數,m和n 誰先把自己的元素比較完成,然後剩下的元素補充到臨時空間的後邊就行。
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
//數組2是空的話,直接可以返回
if (nums2.empty()) {
return;
}
//數組1 沒有元素的話直接吧數組2拷貝過來就可以
if (m == 0) {
std::copy(nums2.begin(), nums2.end(), nums1.begin());
return;
}
//利用額外空間
vector<int> res;
res.reserve(nums1.size());
int index1 = 0, index2 = 0, count = 0;
for (;index1 < m && index2 < n;) {
if (nums1[index1] <= nums2[index2]) {
res.push_back(nums1[index1]);
index1++;
} else {
res.push_back(nums2[index2]);
index2++;
}
}
if (index1 == m && index2 < n) {
for (; index2 < n; index2++) {
res.push_back(nums2[index2]);
}
// std::copy(nums2.begin() + index2 , nums2.end(), std::back_inserter(res));
} else if (index1 < m && index2 == n) {
for (; index1 < m; index1++) {
res.push_back(nums1[index1]);
}
//std::copy(nums1.begin() + index1 , nums1.begin() + m,std::back_inserter(res));
} else {
}
std::copy(res.begin(), res.end(), nums1.begin());
}
};
方法二:
這個也沒啥特殊的想法,就是直接把數組二copy給數組一,然後來個排序操作。
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
std::copy(nums2.begin(), nums2.end(), nums1.begin() + m);
std::sort(nums1.begin(), nums1.end());
}
};