c++ - 分区相等子集和 Leetcode : RUNTIME ERROR
问题描述
class Solution {
public:
bool subsetSum(vector<int> a,int n,int sum){
bool dp[n+1][sum+1];
int i,j;
for(i=0;i<=n;i++){
for(j=0;j<=sum;j++){
if(j==0){
dp[i][j]=true;
}
else if(j==0){
dp[i][j]=false;
}
}
}
for(i=1;i<=n;i++){
for(j=1;j<=sum;j++){
if(j < a[i-1]){
dp[i][j]= dp[i-1][j];
}
else{
dp[i][j]= dp[i-1][j] || dp[i-1][j-a[i]];
}
}
}
return dp[n][sum];
}
bool canPartition(vector<int>& nums) {
int i,n=nums.size();
int sum=0;
for(i=0;i<n;i++){
sum+=nums[i];
}
if(sum%2!=0){
return false;
}
else{
return subsetSum(nums,n,sum/2);
}
}
};
我们必须返回 TRUE 或 FALSE,是否可以将给定的数组分成 2 部分,但总和必须相同(大小可能会有所不同)。UndefinedBehaviorSanitizer: undefined-behavior prog_joined.cpp:32:45 收到此错误,请帮忙。
解决方案
查看代码,它必须是向量或数组边界错误。那么仔细观察我们会看到什么?
for(i=1;i<=n;i++){
...
dp[i][j]= dp[i-1][j] || dp[i-1][j-a[i]];
^^^^
a
有大小n
,因此,当i
等于时n
,a[i]
是一个向量越界错误。
能够清楚地看到您编写的代码对于程序员来说是一项有用的技能。在查看您自己的代码时尽量保持客观,尝试放弃您的假设。
推荐阅读
- javascript - 在 ES6 中解构大对象时自动分配变量
- c - 如何从字符串中获取特定的子字符串?
- sql - 如何添加将以正确顺序显示的日期(月份),现在它在递归 CTE SQL 中倒退
- javascript - 如何在本机反应中从javascript激活TouchablePpacity onPress?
- qt - 使用着色器可视化两个图像的交集
- android - OnClick 用于片段中的 2/3 回收器视图(其本身托管/放置在另一个片段上)不起作用
- excel - 日期操作以输出相同的日期
- git - Theia 工作区中的多个 Git 存储库
- node.js - Node.js:下载 gzip 文件,解压缩并使用重命名保存文件
- microsoft-teams - 如何在 Web 应用程序中嵌入 Teams 频道聊天