ovovovovovovo 2024-09-09 10:24 采纳率: 100%
浏览 5
已结题

合并两个有序数组刷题出错

今天在力扣上刷题,题目是88号 合并两个有序数组,题目描述如下:
给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。

请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。

注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。

代码模板给出来的是用两个vector数组,所以自然而然想到用vector相关的操作来实现,我的解决方案是:

class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        vector<int>::iterator p = nums1.begin();
        vector<int>::iterator q = nums2.begin();

        if(m == 0){ // 如果nums1的长度为0,可跳过运算,直接指向nums2的地址
            vector<int> temp = nums1; 
            nums1 = nums2;

            temp.clear();
        }
        else{
            while(p != nums1.begin() + m && q != nums2.end()){ // 同时比较
                if(*p < *q || *p == *q){
                    p = p + 1;
                }
                else{
                    nums1.emplace(p , *q);
                    q = q + 1;
                }
            }

            if(p == nums1.begin() + m){ // p先到达结尾,q还有剩
                nums1.insert(p,q,nums2.end());
            }// q先到达结尾,p还有剩时无需操作
                
            nums1.assign(nums1.begin(),nums1.begin()+m+n); // 截断nums1数组
        }

    }
};

结果提示错误,报错如下:

解答错误
6 / 59 个通过的测试用例

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

添加到测试用例
输出
[1,2,2,5,6,3]
预期结果
[1,2,2,3,5,6]

经过几次检查都没发现问题,不理解为什么3到了最后去了,猜到应该是插入那行将第二个数组后面剩下的插到3前面了,但是原逻辑又没有看出错误,如果修改insert函数中的第一个参数为p+1,则此测试用例通过,但会卡在上一个测试用例中(实际上逻辑我也想不通),求高人解答一下哪里错误,定虚心受教。

  • 写回答

1条回答 默认 最新

  • micthis 2024-09-09 13:33
    关注

    每插入一个数到nums1,m得自加,
    还有应将nums1.emplace(p , *q)+1赋给p,因为原位构造后向量可能重新分配了内存。
    代码:

    class Solution {
    public:
        void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
            int x=m;
            vector<int>::iterator p = nums1.begin();
            vector<int>::iterator q = nums2.begin();
            if(m == 0){ // 如果nums1的长度为0,可跳过运算,直接指向nums2的地址
                vector<int> temp = nums1; 
                nums1 = nums2;
                temp.clear();
            }
            else{
                while(p != nums1.begin() + m && q != nums2.end()){ // 同时比较
                    if(*p < *q || *p == *q){
                        p = p + 1;
                    }
                    else{
                        p= nums1.emplace(p , *q)+1;
                        m++;
                        q = q + 1;
                    }
                }
                if(p == nums1.begin() + m){ // p先到达结尾,q还有剩
                    nums1.insert(p,q,nums2.end());
                }// q先到达结尾,p还有剩时无需操作
                nums1.assign(nums1.begin(),nums1.begin()+x+n); // 截断nums1数组
            }
        }
    };
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 9月17日
  • 已采纳回答 9月9日
  • 创建了问题 9月9日

悬赏问题

  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见
  • ¥15 一共有五道问题关于整数幂的运算还有房间号码 还有网络密码的解答?(语言-python)
  • ¥20 sentry如何捕获上传Android ndk 崩溃
  • ¥15 在做logistic回归模型限制性立方条图时候,不能出完整图的困难
  • ¥15 G0系列单片机HAL库中景园gc9307液晶驱动芯片无法使用硬件SPI+DMA驱动,如何解决?