错误情况(一)
错误信息
在重刷47.全排列II时,写了如下代码:
class Solution {
public:
void dfs(vector<int>& path, unordered_set<int>& st, vector<vector<int>>& res, vector<int>& nums){
if(path.size() == nums.size()){
res.push_back(path);
return;
}
for(int i = 0;i < nums.size(); ++ i){
if(st.find(i) == st.end()){
if( !i && nums[i] == nums[i - 1] && st.find(i - 1) == st.end()) continue;
st.insert(i);
path.push_back(nums[i]);
dfs(path, st, res, nums);
path.pop_back();
st.erase(i);
}
}
}
vector<vector<int>> permuteUnique(vector<int>& nums) {
// 对重复数据进行集中处理,而且不可以按照组合的方式去重,复杂度是阶乘,可以使用set去重
// 去重的一种有效做法是保持数字的相对次序不变,即第一个1没有使用的情况下,其他1不可以使用
// 只要第一个1的位置不同,其余1的位置也会不同
sort(nums.begin(), nums.end());
vector<vector<int>> res;
vector<int> path;
unordered_set<int> st;
dfs(path, st, res, nums);
return res;
}
};
出现如下错误信息:
Line 1037: Char 34: runtime error: addition of unsigned offset to 0x502000000090 overflowed to 0x50200000008c (stl_vector.h)
SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior /usr/bin/../lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/bits/stl_vector.h:1046:34
错误定位
通过注释代码的方法,定位到错误的位置在dfs
函数里的if
判断:
if( !i && nums[i] == nums[i - 1] && st.find(i - 1) == st.end()) continue;
错误原因
当i
为0
元素时,会执行nums[i] == nums[i - 1]
,i - 1
为负数,作为数组索引是不合法的,因此会报如上错误。换言之,当数组索引是负数时,会出现上述错误。文章来源:https://www.toymoban.com/news/detail-839955.html
修改错误
之所以写!i
,是因为我的逻辑出错的,应该写i != 0
或者i
。文章来源地址https://www.toymoban.com/news/detail-839955.html
到了这里,关于LeetCode:Line 1037: Char 34: runtime error: addition of unsigned offset to 0x502000000090 overflowed的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!