任务是: 这里
我已经在本地计算机上成功获得了工作代码,也在平台上尝试了我的解决方案的前三个案例。但是如果我运行 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);
交换
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--];
}
}