C++ LeetCode #377 的 DP 解决方案中,此代码是否有错误?
C++ DP solution to LeetCode #377, does this code have a bug?
这个C++解决方案是对论坛中投票最多的Java解决方案的直接翻译。我自己的 G++ 编译器可以很好地编译并运行它,但是 LeetCode 提交会产生错误(请快速尝试(。
我认为内存已正确初始化,边界检查已到位。可能是什么问题?
class Solution {
public:
int combinationSum4(vector<int>& nums, int target) {
vector<int> dp(target + 1, 0);
dp[0] = 1;
for (int i = 1; i < dp.size(); i++) {
for (int j = 0; j < nums.size(); j++) {
if (i - nums[j] >= 0) {
dp[i] += dp[i - nums[j]];
}
}
}
return dp[target];
}
};
int main(int argc, char** argv) {
vector<int> nums {
3, 33, 333,
};
cout << Solution().combinationSum4(nums, 10000) << endl;
return 0;
}
测试用例:
[3,33,333]
10000
错误信息:
Line 9: Char 17: runtime error: signed integer overflow: 357856184 + 1941940377 cannot be represented in type 'int' (solution.cpp)
该消息清楚地显示了错误。 357856184 + 1941940377 = 2299796561大于 32 位 int max -> 2^31 - 1 = 2147483647。
在C++标准中,不能保证int的大小。因此,为了安全起见,您可以使用int64_t,根据C++ 11。
https://en.cppreference.com/w/cpp/language/types
这个算法是正确的,但有缺陷。它在计算过程中不处理整数溢出。改进的解决方案如下:
class Solution {
public:
int combinationSum4(vector<int>& nums, int target) {
vector<long> dp(target + 1, 0);
dp[0] = 1;
for (int i = 1; i < dp.size(); i++) {
for (int j = 0; j < nums.size(); j++) {
if (i - nums[j] >= 0) {
dp[i] += dp[i - nums[j]];
dp[i] %= numeric_limits<int>::max();
}
}
}
return dp[target];
}
};
相关文章:
- 此代码是否违反一个定义规则
- C++ LeetCode #377 的 DP 解决方案中,此代码是否有错误?
- 在cpp中使用boost-python的python代码是否进行动态内存分配
- 使用全局 IP 地址时,C++ winsock 2 应用程序中的代码是否必须更改?
- 以下代码是否存在内存泄漏?
- 如何判断我正在运行的Microsoft C++代码是否使用 /EHa 开关编译?
- 我的选择排序代码是否存在导致它跳过数组中的元素的问题?
- 代码是否有效.如果我想显示第一个元素?如果不是,那么 s.begin() 会返回什么?
- C++模板的对象代码是否在可执行文件和动态库中重复?
- 任何人都可以检查这个回文 c++ 代码是否正确
- Android Studio 项目中的 c++ 代码是否最终出现在 apk 文件中(除了 .so 文件)
- 此代码是否容易受到 SQL 注入的攻击?我该如何使其安全
- 使用 log4cplus 将日志发送到远程系统日志服务器的代码是否正确
- 代码是否交换数组的两个数字
- 如何检查编译的代码是否使用了 SSE 和 AVX 指令?
- 此代码是否有逻辑错误
- 使用 char16_t 类型作为 char[] 数组,并通过 reinterpret_cast<> 重新转换它。我的代码是否有未定义的行为?
- GPU cuda 代码是否适用于多个 GPU 卡而无需任何实现
- 此代码是否对C++线程安全
- QaudioOutput代码是否有任何内存泄漏