leetcode 88. 合并排序数组 c++ 运行时错误
leetcode 88. Merge Sorted Array c++ runtime error
我正在做 leetcode 问题 88。这是 link:Merge Sorted Array。
给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中作为一个有序数组。 nums1和nums2中初始化的元素个数分别为m和n。您可以假设 nums1 有足够的 space(大于或等于 m + n 的大小)来容纳 nums2.
中的其他元素
我用c++来解决这个问题。但我总是遇到这样的运行时错误:
Runtime Error Message:
Line 922: Char 34: runtime error: reference binding to null pointer of type 'value_type' (stl_vector.h)
Last executed input:
[1]
1
[]
0
这是我的代码:
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int output[m+n] = {0};
int i = 0;
int j = 0;
if(sizeof(nums1) == 0)
{
for(i = 0; i < n; i++)
{
nums1[i] = nums2[i];
}
return;
}
if(sizeof(nums2) == 0)
{
return;
}
for(int k = 0; k < m+n; k++)
{
if(nums1[i] <= nums2[j])
{
if(i < m)
{
output[k] = nums1[i];
i++;
}
else if(j < n)
{
output[k] = nums2[j];
j++;
}
}
else if(nums1[i] >= nums2[j])
{
if(j < n)
{
output[k] = nums2[j];
j++;
}
else if(i < m)
{
output[k] = nums1[i];
i++;
}
}
}
for(i = 0; i < m+n; i++)
{
nums1[i] = output[i];
}
}
};
测试很简单,点击上面的link复制我的代码提交即可。我希望有人能帮助我。
当使用 std::vector
时,要检查它是否为空,应使用成员函数 size()
。 sizeof
不是正确的检查。
if(sizeof(nums1) == 0)
应该是
nums1.size()==0
nums2 向量也是如此。另一件需要注意的事情是 output
数组大小在编译时是未知的,并且通常不支持 VLA,在这里也使用 vector
std::vector<int> output(m+n,0); //Initialized with m+n elements with value 0
您当前的方法存在一些缺陷,例如:
sizeof(nums1)
运算符只会在以下情况下给您 0
:nums1[],m=0,nums2[],n=0
,因为对于 m=0
但 n!=0
的所有其他情况], nums1
将包含 0
,并且它不会是一个空列表。前任。 nums1[0,0],m=0,nums2[1,2],n=2
。要处理此问题,请检查 m==0
或 n==0
而不是使用 sizeof
.
行if(nums1[i] <= nums2[j])
,如果j>=n
,会抛出分段错误
如果你检查LeetCode上的所有测试用例,你可能会发现更多缺陷。
下面给出正确的做法。这个解决方案在 LeetCode 上被接受。我添加了大部分不言自明的评论。如果您有任何疑问,请随时发表评论。
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int output[m+n] = {0};
int i = 0;
int j = 0;
int k = 0;
if(m == 0) // nums1 is empty. Ex. nums1[0,0],m=0 and nums2[1,2],n=2
{
for(i = 0; i < n; i++)
{
nums1[i] = nums2[i];
}
return;
}
if(n == 0) // nums2 is empty. Ex. nums1[1,2],m=2 and nums2[],n=0
{
return;
}
for(k = 0; k < m+n; k++)
{
if(i>=m || j>=n) // Check if we've exhausted any of nums1 or nums2 list
break;
if(nums1[i] <= nums2[j]) // if nums1[i] <= nums2[j]
{
output[k] = nums1[i];
i++;
}
else{ // else, nums1[i] > nums2[j]
output[k] = nums2[j];
j++;
}
}
while(i<m){ // If some elements are left in nums1. Ex: nums1[4,0,0],m=1 and nums2[1,2],n=2
output[k] = nums1[i];
i++;
k++;
}
while(j<n){ // If some elements are left in nums2. Ex: nums1[1,2,0],m=2 and nums2[4],n=1
output[k] = nums2[j];
j++;
k++;
}
for(i = 0; i < m+n; i++) // Copy back to nums1
{
nums1[i] = output[i];
}
}
};
我正在做 leetcode 问题 88。这是 link:Merge Sorted Array。
给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中作为一个有序数组。 nums1和nums2中初始化的元素个数分别为m和n。您可以假设 nums1 有足够的 space(大于或等于 m + n 的大小)来容纳 nums2.
中的其他元素我用c++来解决这个问题。但我总是遇到这样的运行时错误:
Runtime Error Message:
Line 922: Char 34: runtime error: reference binding to null pointer of type 'value_type' (stl_vector.h)
Last executed input:
[1]
1
[]
0
这是我的代码:
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int output[m+n] = {0};
int i = 0;
int j = 0;
if(sizeof(nums1) == 0)
{
for(i = 0; i < n; i++)
{
nums1[i] = nums2[i];
}
return;
}
if(sizeof(nums2) == 0)
{
return;
}
for(int k = 0; k < m+n; k++)
{
if(nums1[i] <= nums2[j])
{
if(i < m)
{
output[k] = nums1[i];
i++;
}
else if(j < n)
{
output[k] = nums2[j];
j++;
}
}
else if(nums1[i] >= nums2[j])
{
if(j < n)
{
output[k] = nums2[j];
j++;
}
else if(i < m)
{
output[k] = nums1[i];
i++;
}
}
}
for(i = 0; i < m+n; i++)
{
nums1[i] = output[i];
}
}
};
测试很简单,点击上面的link复制我的代码提交即可。我希望有人能帮助我。
当使用 std::vector
时,要检查它是否为空,应使用成员函数 size()
。 sizeof
不是正确的检查。
if(sizeof(nums1) == 0)
应该是
nums1.size()==0
nums2 向量也是如此。另一件需要注意的事情是 output
数组大小在编译时是未知的,并且通常不支持 VLA,在这里也使用 vector
std::vector<int> output(m+n,0); //Initialized with m+n elements with value 0
您当前的方法存在一些缺陷,例如:
sizeof(nums1)
运算符只会在以下情况下给您0
:nums1[],m=0,nums2[],n=0
,因为对于m=0
但n!=0
的所有其他情况],nums1
将包含0
,并且它不会是一个空列表。前任。nums1[0,0],m=0,nums2[1,2],n=2
。要处理此问题,请检查m==0
或n==0
而不是使用sizeof
.行
if(nums1[i] <= nums2[j])
,如果j>=n
,会抛出分段错误如果你检查LeetCode上的所有测试用例,你可能会发现更多缺陷。
下面给出正确的做法。这个解决方案在 LeetCode 上被接受。我添加了大部分不言自明的评论。如果您有任何疑问,请随时发表评论。
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int output[m+n] = {0};
int i = 0;
int j = 0;
int k = 0;
if(m == 0) // nums1 is empty. Ex. nums1[0,0],m=0 and nums2[1,2],n=2
{
for(i = 0; i < n; i++)
{
nums1[i] = nums2[i];
}
return;
}
if(n == 0) // nums2 is empty. Ex. nums1[1,2],m=2 and nums2[],n=0
{
return;
}
for(k = 0; k < m+n; k++)
{
if(i>=m || j>=n) // Check if we've exhausted any of nums1 or nums2 list
break;
if(nums1[i] <= nums2[j]) // if nums1[i] <= nums2[j]
{
output[k] = nums1[i];
i++;
}
else{ // else, nums1[i] > nums2[j]
output[k] = nums2[j];
j++;
}
}
while(i<m){ // If some elements are left in nums1. Ex: nums1[4,0,0],m=1 and nums2[1,2],n=2
output[k] = nums1[i];
i++;
k++;
}
while(j<n){ // If some elements are left in nums2. Ex: nums1[1,2,0],m=2 and nums2[4],n=1
output[k] = nums2[j];
j++;
k++;
}
for(i = 0; i < m+n; i++) // Copy back to nums1
{
nums1[i] = output[i];
}
}
};