首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >合并两个有序数组

合并两个有序数组

作者头像
大忽悠爱学习
发布2022-05-05 19:10:08
发布2022-05-05 19:10:08
1.4K0
举报
文章被收录于专栏:c++与qt学习c++与qt学习

自己的写法:对较长的nums1数组使用了双指针法,qp一个在前一个在后,初始时分别指向nums1的第一个元素和第二个元素,分情况讨论有三种,如下代码所示:

代码语言:javascript
复制
#include<iostream>
#include<vector>
using namespace std;
class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) 
    {
        //双指针
        int q = 0;
        int p = 1;
        for (int i = 0; i < n; i++)
        {
            q = 0;
            p = 1;
             //一共三种情况
                //1.插在数组第一个元素前面
                if (nums2[i] <=nums1[0])
                {
                    for (int j = m-1; j >= 0; j--)
                    {
                        nums1[j + 1] = nums1[j];
                    }
                    nums1[0] = nums2[i];
                    m++;
                    continue;
                }
                //2.插在数组最后一个元素的后一个位置
                if (nums2[i] >= nums1[m - 1])
                {
                    nums1[m] = nums2[i];
                    m++;
                    continue;
                }
                //3.插在快慢指针qp之间
                while (p < m)
                {
                    if (nums2[i] <= nums1[p] && nums2[i] > nums1[q])
                    {
                        for (int j = m - 1; j >= p; j--)
                        {
                            nums1[j + 1] = nums1[j];
                        }
                        nums1[q + 1] = nums2[i];
                        m++;
                        break;
                    }
                    q++, p++;
                }
        }
    }
};
void test()
{
    vector<int> v1 = { 1,2,3,0,0,0 };
    vector<int> v2 = { 2,5,6 };
    Solution s;
    s.merge(v1, 3, v2, 3);
    for (int i = 0; i < v1.size(); i++)
    {
        cout << v1[i] << " ";
    }
}
int main()
{
    test();
    system("pause");
    return 0;
}

参照他人的解法

方法一 : 合并后排序

代码语言:javascript
复制
class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) 
    {
        //第一步合并两个容器
        int j = 0;
        for (int i = m; i < m + n; i++)
        {
            nums1[i] = nums2[j++];
        }
        //对合并后的容器进行排序
        sort(nums1.begin(), nums1.end());
    }
};

方法三 : 双指针 / 从后往前

代码语言:javascript
复制
class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) 
    {
        int i = m + n - 1;
        m--, n--;
        while (n >= 0)
        {
            while (m >= 0 && (nums1[m] > nums2[n]))
            {
                nums1[i--] = nums1[m--];
            }
            nums1[i--] = nums2[n--];
        }
    }
};
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-03-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 参照他人的解法
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档