88。合并排序数组 [leetcode] [c++]

问题描述 投票:0回答:1

任务是: 这里

我已经在本地计算机上成功获得了工作代码,也在平台上尝试了我的解决方案的前三个案例。但是如果我运行 Submit 我会在这种情况下收到未定义的行为运行时错误: nums1 = [2,0],m = 1,nums2 = [1],n = 1。据我了解,结果必须是 nums1 = [1,2],并且我已在本地计算机中得到它,没有任何错误。为什么会这样?

class Solution {
public:
    void merge(std::vector<int>& nums1, int m, std::vector<int>& nums2, int n);
};

void Solution::merge(std::vector<int>& nums1, int m, std::vector<int>& nums2, int n)
{
    int iNums1 = m - 1;
    int iNums2 = n - 1;
    int iResult = m + n - 1;

    for (; iResult >= 0 && iNums2 >= 0; iResult--)
    {
        if (iNums2 < 0)
        {
            break;;
        }
        else if (iNums1 < 0 && iNums2 >= 0)
        {
            std::swap(nums2, nums1);
            break;
        }       
        else if (nums2[iNums2] > nums1[iNums1])
        {
            nums1[iResult] = nums2[iNums2--];
        }
        else if (iResult <= m && nums1[iResult - 1] <= nums2[iNums2] && nums1[iResult] > nums2[iNums2])
        {
            nums1[iResult + 1] = nums1[iResult];
            nums1[iResult] = nums2[iNums2--];
        }
    }
}

在本地机器上使用测试用例,没有发生错误:

Solution s;
std::vector<int> nums1 = { 2, 0 };
std::vector<int> nums2 = { 1 };
std::vector<int> result = { 1, 2 };
s.merge(nums1, 1, nums2, 1);


c++ arrays sorting merge undefined-behavior
1个回答
0
投票

交换

nums1
nums2
没有意义,因为结果应该完全存储在
nums1
中。

另外,最后一个条件不是必须的;如果要添加到输出的下一个元素不是来自第一个向量,那么它一定来自第二个向量。剩下要检查的是边界:如果第一个向量中没有剩余元素,我们只能从第二个向量中获取元素,反之亦然。

for (; iResult >= 0 && iNums2 >= 0; iResult--) {      
    if (iNums1 < 0 || iNums2 >= 0 && nums2[iNums2] > nums1[iNums1]){
        nums1[iResult] = nums2[iNums2--];
    } else {
        nums1[iResult] = nums1[iNums1--];
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.