88. 合并两个有序数组
思路1:暴力法
直接遍历合并后sort()
附上本人三年前的写法:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n)
{
for(int i=m;i<m+n;i++)
{
nums1[i]=nums2[i-m];
}
sort(nums1.begin(),nums1.end());
}
方法可行,但有些摸鱼偷懒,并且浪费了题目给出的条件“非递减”、“nums1的初始长度m + n”
题目的用意应该有两个目的:
1.不开辟额外空间,在nums1中完成结果
2.利用两个数组的有序性,边合并边排序
思路2:逆向双指针
在之前的文章有写过感悟:双指针多用于有序数组中,笔者一开始的思路有想到这方面,但没有考虑到逆向。
原地修改时,为了避免从前往后遍历导致原有数组元素被破坏掉,所以考虑逆向遍历。
在题解评论区看到了一句话,做个小摘抄:
“所有玩家都全力向前冲刺, 却不知道向后才是胜利之门。”-《头号玩家》
逆向双指针的具体思路:
1.使用三个指针i,j,k
2.nums1较大时,交换1和k的数字,循环直到满足3的条件
3.nums2小于或等于时,交换k和j的数字
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int size1=m+n;
int i=m-1;
int j=n-1;
int k=m+n-1;
if(m==0)
nums1=nums2;
while(j>=0){
while(i>=0&&nums1[i]>nums2[j]){
swap(nums1[k],nums1[i]);
i--;k--;
}
swap(nums1[k],nums2[j]);
j--;k--;
}
}
debug了两天,这个思路是在说有点绕,我是菜狗我爱暴力法,私密马赛