力扣网/牛客网 | 算法面试题汇总 | 合并两个有序数组

26 篇文章 0 订阅
20 篇文章 0 订阅

题目

算法面试题汇总 - LeetBook - 力扣(LeetCode)全球极客挚爱的技术成长平台

给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。

 

说明:

初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。
你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。
 

示例:

输入:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6],       n = 3

输出:[1,2,2,3,5,6]
 

提示:

-10^9 <= nums1[i], nums2[i] <= 10^9
nums1.length == m + n
nums2.length == n

作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetbook/read/top-interview-questions/xmi2l7/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

解析

双指针-从前往后遍历

最朴素的思路,就是判断大小:
nums1[i]>nums2[j]时,nums1的i及其之后元素后移,将nums2[j]插入到i的位置,将m,i,j加1;
nums1[i]<=nums2[j]时,i+=1;

可以利用额外的数组空间降低复杂度。

class Solution {
public:
    void vector_insert(vector<int>& nums1, int i, int m, int num){
        for(int j=m-1;j>=i;j-=1){
            nums1[j+1]=nums1[j];
        }
        nums1[i]=num;
    }
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        if(m==0){
            nums1=nums2;
            return;
        }
        int i=0,j=0;
        while(i<m&&j<n){
            if(nums1[i]<=nums2[j]){
                i+=1;
                continue;
            }else{
                vector_insert(nums1,i,m,nums2[j]);
                m+=1;
                i+=1;j+=1;
            }
        }
        while(j<n){
            nums1[i]=nums2[j];
            i+=1;j+=1;
        }
        
    }
};
/*
[1,2,3,0,0,0]
3
[2,5,6]
3

[4,5,6,0,0,0]
3
[1,2,3]
3
*/

从前往后-空间换时间

用temp存储nums1的数据,用temp和nums2进行大小比较,存入nums1中

class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {   
        vector<int> temp(nums1);       //初始化m为nums1的拷贝
        int i = 0, j = 0, k = 0;

        while(i <= m-1 && j <= n-1)
        {
            if(temp[i] < nums2[j])                
            	nums1[k++] = temp[i++];
            else               
            	nums1[k++] = nums2[j++];
        }
        while(i <= m-1)         
        {
            nums1[n+i] = temp[i];
            i++;
        }
         while(j <= n-1)
        {
            nums1[m+j] = nums2[j];
            j++;
        }

    }
};
/*
作者:zrita
链接:https://leetcode-cn.com/problems/merge-sorted-array/solution/c-san-chong-fang-fa-z-by-zrita/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。*/

从后往前遍历

大的先走~~

void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
    int i = nums1.size() - 1;
    m--;
    n--;
    while (n >= 0) {
        while (m >= 0 && nums1[m] > nums2[n]) {
            swap(nums1[i--], nums1[m--]);
        }
        swap(nums1[i--], nums2[n--]);
    }
}
/*
作者:ikaruga
链接:https://leetcode-cn.com/problems/merge-sorted-array/solution/88-by-ikaruga/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。*/
class Solution {
public:
    void merge(int A[], int m, int B[], int n) {
        int i = m - 1, j = n - 1, index = m + n - 1;
        while (i >= 0 && j >= 0)
            A[index--] = A[i] > B[j] ? A[i--] : B[j--];
        while (j >= 0)
            A[index--] = B[j--];
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值