当我试图解决这个采访问题时:找到一个数组中连续元素的总和,它等于一个目标数,所以我想出了下面的代码。但是,我真的不明白它为什么会有一些内存分配问题。以下是完整代码的link。当我试图将currSum的第二个元素插入到集合和映射中时,它将会出现一些错误消息,例如“内存被破坏的已分配块的结尾”。未设置,映射是否为插入动态分配?我真的不明白为什么它不像我想的那样工作。
我也在这里粘贴完整的代码:
#include <map>
#include <set>
#include <iostream>
using namespace std;
void print_array(int arr[], int start, int end)
{
for(int i=start;i<=end;i++)
cout<<arr[i]<<" ";
cout<<endl;
}
//given an array, find the continous sum of the array which is a target number
void findTargetSum(int arr[], int target, int sizeArr)
{
map<int, int> valIdxMap;
set<int> prevSet;
int* currSum= new int(sizeArr+1);
currSum[0]=0;
for(int i=1;i<=sizeArr;i++)
{
currSum[i]=currSum[i-1]+arr[i-1];
}
//now the problem is to find two elements i, j in array currSum,where currSum[j]-currSum[i]=target && j>i
for(int i=0; i<=sizeArr;i++)
{
int tmp=currSum[i]-target;
set<int>::iterator iter=prevSet.find(tmp);
if (iter !=prevSet.end())
{
cout<<"located one range of array elements with sum to"<<target<<endl;
int startIdx=valIdxMap[*iter];
print_array(arr,startIdx,i-1);
}
else
{
prevSet.insert(currSum[i]);
valIdxMap.insert(make_pair(currSum[i],i));
}
}
delete currSum;
}
void testfindTargetSum()
{
int tst_arr[]={2,4,5,-1,3,8};
int target=11;
findTargetSum(tst_arr,11,6);
}
int main()
{
testfindTargetSum();
return 1;
}
答案 0 :(得分:4)
错误在这一行:
int* currSum= new int(sizeArr+1);
该行获取单个int
并将其初始化为值sizeArr+1
。你可能意味着:
int* currSum= new int[sizeArr+1];
这将获得sizeArr+1
类型的int
元素块。此外,您必须将行delete currSum;
更改为delete [] currSum;
。
另一方面,我的建议不是手动管理内存,而是使用标准容器,例如:
std::vector<int> currSum( sizeArr+1 );
基本上是当前实现的就地替代品,它将自动管理内存。
在实现时,我相信你实际上可以通过在迭代时累加三个变量中的起始索引,结束索引和值的总和而在O(N)中没有任何额外的内存。当累计值小于目标值时,增加结束索引并添加值。当累计值增长到高于目标值时,增加起始索引并将累计值减去该量。
答案 1 :(得分:3)
int* currSum= new int(sizeArr+1);
你可能意味着
int* currSum= new int[sizeArr+1];