C++ leetcode 88。合并排序数组c++;运行时错误
我正在做leetcode问题88。以下是链接: 给定两个已排序整数数组nums1和nums2,将nums2作为一个已排序数组合并到nums1中。nums1和nums2中初始化的元素数分别为m和n。您可以假设nums1有足够的空间(大小大于或等于m+n)来容纳nums2中的其他元素 我用C++解决了这个问题。但我总是遇到这样的运行时错误:C++ leetcode 88。合并排序数组c++;运行时错误,c++,mergesort,C++,Mergesort,我正在做leetcode问题88。以下是链接: 给定两个已排序整数数组nums1和nums2,将nums2作为一个已排序数组合并到nums1中。nums1和nums2中初始化的元素数分别为m和n。您可以假设nums1有足够的空间(大小大于或等于m+n)来容纳nums2中的其他元素 我用C++解决了这个问题。但我总是遇到这样的运行时错误: Runtime Error Message: Line 922: Char 34: runtime error: reference binding to nu
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];
}
}
};
类解决方案{
公众:
无效合并(向量和nums1,int m,向量和nums2,int n){
int输出[m+n]={0};
int i=0;
int j=0;
if(sizeof(nums1)==0)
{
对于(i=0;i
它很容易测试,只需点击上面的链接,复制我的代码,然后提交。我希望有人能帮助我 使用
std::vector
时,要检查它是否为空,应使用成员函数size()
sizeof
不是正确的检查
if(sizeof(nums1) == 0)
应该是
nums1.size()==0
nums2向量也是如此。另一件需要注意的事情是输出
数组大小在编译时是未知的,通常不支持VLA,在这里也使用vector
std::vector<int> output(m+n,0); //Initialized with m+n elements with value 0
std::向量输出(m+n,0)//使用值为0的m+n元素初始化
您当前的方法存在一些缺陷,例如:
运算符只在以下情况下给您提供sizeof(nums1)
:nums1[],m=0,nums2[],n=0,因为对于所有其他情况,当0
但m=0
,n=0
将包含nums1
,并且它不会是空列表。例如0
。要处理此问题,请检查nums1[0,0],m=0,nums2[1,2],n=2
或m==0
而不是使用n==0
sizeof
- 在
,它将抛出分段错误行中,如果(nums1[i]=n
- 如果检查LeetCode上的所有测试用例,您可能会发现更多的缺陷
类解决方案{
公众:
无效合并(向量和nums1,int m,向量和nums2,int n){
int输出[m+n]={0};
int i=0;
int j=0;
int k=0;
如果(m==0)//nums1为空。例如nums1[0,0],m=0和nums2[1,2],n=2
{
对于(i=0;i=m | | j>=n)//检查是否已用尽nums1或nums2列表中的任何一个
打破
如果(nums1[i]sizeof(nums1)==0
永远都不是真的。sizeof(nums2)==0
请注意,您不需要额外的p数组。问题是建议不要这样做(num1足够大)。首先尝试在末尾填充num1。在使用num1[i]
和num2[j]之前,您必须先测试i
和j
的有效性
.UBI修改了我的代码,它有了一点改进。但它遇到了另一个问题。运行时错误消息:AddressSanitarizer:在pc 0x00000040756f bp 0x7ffe441385f0 sp 0x7ffe441385e8上的地址0x602000000274上的堆缓冲区溢出