合并两个有序数组

这一生的挚爱 提交于 2020-03-03 11:12:14


给定两个排序后的数组 A 和 B,其中 A 的末端有足够的缓冲空间容纳 B。 编写一个方法,将 B 合并入 A 并排序。

初始化 A 和 B 的元素数量分别为 m 和 n。

示例:

输入:
A = [1,2,3,8,0,0,0], m = 4
B = [2,5,6],       n = 3

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


迭代器故障,说是数组越界,不求甚解
class Solution {
public:
    void merge(vector<int>& A, int m, vector<int>& B, int n) {
        int len=A.capacity();
        int a=0;
        int b=0;
       
        vector<int>::iterator ita=A.begin();
        vector<int>::iterator itb=B.begin();
        vector<int> tem(A);
        vector<int>::iterator itc=tem.begin();
       
        while(len--)
        {
            if(*ita<*itb)  //先比较大小
            {
                a++;       //设置标记,如果A遍历完了,就直接用B
                if(a<=m)
                {
                  *itc=*ita;
                  ita++;
                }
                else
                {
                    *itc=*itb;
                    itb++;  //相应迭代器也要更新
                }    
            }
            else
            {
                b++;             //设置标记,如果B遍历完了,就直接遍历A
                if(b<=n)    
                {
                    *itc=*itb;
                    itb++;
                }
                else
                {
                    *itc=*ita;
                    ita++;
                }
            }
          itc++;
        }
        ita=tem.begin();
        for(vector<int>::iterator it=A.begin(); it!=A.end();it++)
        {
            *it=*ita;
            ita++;
        }

    }
};
Line 784: Char 17: runtime error: reference binding to null pointer of type 'int' (stl_iterator.h)

此处撰写解题思路
while循环里边,1、先写把A,B,遍历完事的情况是啥,再写比较大小的情况,这个顺序,少些代码,
2、直接定义一个数,pa,pb,再赋值的时候就加进去
代码
class Solution {
public:
    void merge(vector<int>& A, int m, vector<int>& B, int n) {
        int len=A.size();                //capacity()也可以
        int pa=0;
        int pb=0;
        int cur;
        int arr[len];
        while(pa<m||pb<n)                //
        {
            if(pa==m)                           //顺序从后往前
                cur=B[pb++];                //在里边直接更新
            else if(pb==n)
                cur=A[pa++];
            else if(A[pa]<B[pb])
                cur=A[pa++];
            else
                cur=B[pb++];
            arr[pa+pb-1]=cur;
            
        }

        for(int i=0;i<len;i++)  //重新回去
        {
            A[i]=arr[i];
        }
    }
};
 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!