每周一道算法题启动
题目
【题目链接】
【解法一】合并后排序
排序后的数组自动省略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;}//复制数组回去num1nums1 = num3;}
};
执行用时这个不是程序运行时间嗷!