題目描述:
給你兩個按?非遞減順序?排列的整數(shù)數(shù)組?nums1
?和?nums2
,另有兩個整數(shù)?m
?和?n
?,分別表示?nums1
?和?nums2
?中的元素數(shù)目。
請你?合并?nums2
?到?nums1
?中,使合并后的數(shù)組同樣按?非遞減順序?排列。
注意:最終,合并后數(shù)組不應由函數(shù)返回,而是存儲在數(shù)組?nums1
?中。為了應對這種情況,nums1
?的初始長度為?m + n
,其中前?m
?個元素表示應合并的元素,后?n
?個元素為?0
?,應忽略。nums2
?的長度為?n
?。
示例 1:
輸入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3 輸出:[1,2,2,3,5,6] 解釋:需要合并 [1,2,3] 和 [2,5,6] 。 合并結果是 [1,2,2,3,5,6] ,其中斜體加粗標注的為 nums1 中的元素。
示例 2:
輸入:nums1 = [1], m = 1, nums2 = [], n = 0 輸出:[1] 解釋:需要合并 [1] 和 [] 。 合并結果是 [1] 。
示例 3:
輸入:nums1 = [0], m = 0, nums2 = [1], n = 1 輸出:[1] 解釋:需要合并的數(shù)組是 [] 和 [1] 。 合并結果是 [1] 。 注意,因為 m = 0 ,所以 nums1 中沒有元素。nums1 中僅存的 0 僅僅是為了確保合并結果可以順利存放到 nums1 中。
提示:
nums1.length == m + n
nums2.length == n
0 <= m, n <= 200
1 <= m + n <= 200
-109 <= nums1[i], nums2[j] <= 109
進階:你可以設計實現(xiàn)一個時間復雜度為?O(m + n)
?的算法解決此問題嗎?
通過次數(shù)
1.1M
提交次數(shù)
2M
通過率
52.9%
方法一、連入后排序
先把nums2里面的數(shù)組加入nums1后面,然后對nums1排序文章來源:http://www.zghlxwxcb.cn/news/detail-725635.html
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
for(int i=0;i<n;i++)
{
nums1[m+i]=nums2[i];
}
sort(nums1.begin(),nums1.end());
}
};
方法二、向后覆蓋
先設置兩個指針i,j,分別指向nums1的最后一個非零元素和nums2的最后一個元素,再設置一個k指向nums1的最后一個元素。當i>=0&&j>=0時,當i,j指向的比較大的數(shù)放到k的位置,k前移,i或j前移。最后再將剩余元素覆蓋。文章來源地址http://www.zghlxwxcb.cn/news/detail-725635.html
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int i=m-1,j=n-1;
int k=m+n-1;
while(i>=0&&j>=0)
{
if(nums1[i]>=nums2[j])
{
nums1[k]=nums1[i];
k--;
i--;
}
else
{
nums1[k]=nums2[j];
k--;
j--;
}
}
if(i>=0)
{
while(i>=0)
{
nums1[k]=nums1[i];
k--;
i--;
}
}
if(j>=0)
{
while(j>=0)
{
nums1[k]=nums2[j];
k--;
j--;
}
}
}
};
到了這里,關于力扣每日一題88:合并兩個有序數(shù)組的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!