88. 合并两个有序数组

要求:合并两个非递减数组放到nums1里面,长度m和n
思路:
法一:把nums2一个个插进来,插一次后移一次,最坏时间复杂度是全插到前面移动O(n)*(m),空间O(1)

class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        int j=0;
        for(int i=0;i<m+j&&j<n;i++){
            if(nums2[j]<nums1[i]){
                for(int k=m+j-1;k>=i;k--){
                    nums1[k+1]=nums1[k];
                }
                nums1[i]=nums2[j];
                j++;
            }
        }
        while(j<n){
            nums1[m+j]=nums2[j];
            j++;//注意别漏写了。。。
        }
    }
};

法二:先把nums2全加到nums1后面再用sort,时间O((m+n)log(m+n)),空间O(log(m+n))(快排)

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());
    }
};

法三:新开一个数组把nums1nums2按顺序放进来,时间O(m+n),空间O(m+n)

class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        int i=0;
        int j=0;
        int sorted[m+n];
        int index=0;
        while(i<m&&j<n){
            if(nums1[i]<=nums2[j])
                sorted[index++]=nums1[i++];
            else sorted[index++]=nums2[j++];
        }
        while(i<m)
            sorted[index++]=nums1[i++];
        while(j<n)
            sorted[index++]=nums2[j++];
        for(int k=0;k<m+n;k++)
            nums1[k]=sorted[k];
    }
};

法四:两个数组从尾巴开始插,因为i始终不大于cur,可行,时间O(m+n),空间O(1),最好的解法

class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        int i=m-1;
        int j=n-1;
        int cur=m+n-1;
        while(i>=0&&j>=0){
            if(nums2[j]>=nums1[i])
                nums1[cur--]=nums2[j--];
            else nums1[cur--]=nums1[i--];
        }
        while(i>=0)
            nums1[cur--]=nums1[i--];
        while(j>=0)
            nums1[cur--]=nums2[j--];
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值