每周一道算法题启动
题目
【题目链接】
【解法一】合并后排序
排序后的数组自动省略0的数字,又学到了
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());
}
};
【解法二】双指针
时间复杂度:O(m+n)
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
//双指针
int pointer1=0, pointer2=0;
int temporary;
vector<int> num3(m+n); //数组存放
//防止越界
while(pointer1 < m || pointer2 < n)
{
//第一个数组没数放了,第二个数组还有剩的比第一个数组所有数都要大的
//特判情况
if(pointer1 == m)
{
temporary = nums2[pointer2++];
}
else if(pointer2 == n)
{
temporary = nums1[pointer1++];
}
//这里不能等于,要是0的话会放进去,造成不必要麻烦
else if(nums1[pointer1] > nums2[pointer2])
{
temporary = nums2[pointer2++];
}
else
{
temporary = nums1[pointer1++];
}
num3[pointer1 + pointer2 - 1] = temporary;
}
//复制数组回去num1
nums1 = num3;
}
};
执行用时这个不是程序运行时间嗷!