题海拾贝:力扣 88.合并两个有序数组
Hello大家好!很高兴我们又见面啦!给生活添点passion,开始今天的编程之路!
我的博客:<但凡.
我的专栏:《编程之路》、《数据结构与算法之美》、《题海拾贝》
欢迎点赞,关注!
1、题目
2、题解
在这里我们提供两种解决思路,第一种是一种经典的归并排序的核心解决思路。而第二种是更适用于这道题的解决思路。
思路一:
我们新建一个数组(辅助数组),然后遍历原来的两个数组,每次通过比较放入较小的元素:
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
vector<int> nums3(m+n);
int i=0;int j=0;int t=0;
while((i<m)&&(j<n))
{
if(nums1[i]<=nums2[j]){nums3[t++]=nums1[i++];}
else{nums3[t++]=nums2[j++];}
}
while(i<m){nums3[t++]=nums1[i++];}
while(j<n){nums3[t++]=nums2[j++];}
for(i=0;i<n+m;i++){nums1[i]=nums3[i];}
}
};
思路二:
思路二的实现和思路一非常像,但是需要注意的是我们要从后往前遍历。因为从前往后遍历的话,会导致我们num1的原有元素被覆盖
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int i=m-1;
int j=n-1;
int t=m+n-1;
while(i>=0&&j>=0)
{
if(nums2[j]>=nums1[i])
{
nums1[t--]=nums2[j--];
}
else
nums1[t--]=nums1[i--];
}
while(j>=0)
{
nums1[t--]=nums2[j--];
}
}
};
好了,今天的内容就分享到这,我们下期再见!