令人頭禿的bug總是源於基礎不牢------你知道vector.size()是unsigned int嗎
阿新 • • 發佈:2020-10-20
還是前不久寫的《四樹之和》那題:Sort函式居然能改變元素值?記一次有趣的bug——四樹之和
唉···dfs一直超時沒過的去。於是我做了點剪枝優化後,捲土重來:
class Solution {
public:
vector<vector<int>>res;
vector<int> temp;
int sum;
void dfs(vector<int> nums, int sub)
{
if (temp.size() == 4)
{
if (sum == 0)
{
res.push_back(temp);
}
return;
}
if (sub >= nums.size())
{
return;
}
if((4-temp.size())*nums[sub]>-sum)
{
return;
}
temp.push_back(nums[sub]);
sum += nums[sub];
dfs(nums, sub + 1);
sum -= nums[sub];
temp.pop_back();
int next = sub+1;
while (next<nums.size()&&nums[next] == nums[sub]) { next++; }
dfs(nums, next);
}
vector<vector<int>> fourSum(vector<int>& nums, int target) {
sort(nums.begin(),nums.end());
sum = -target;
dfs(nums,0);
return res;
}
};
然鵝,每次執行 都只輸出:
於是我反反覆覆對程式碼的邏輯進行復查,翹了三節課就在這兒找bug,結果找死了也找不到。
於是我掏出我的visual studio2019企業版。。。對每一次遞迴的值進行追蹤。
發現
if((4-temp.size())*nums[sub]>-sum) { return; }
每一次這個if的條件都成立。
此刻我:??????????
進行了一番試驗後,我感到我的臉上發出了啪啪啪的響聲。。。。。。
原來————
temp.size()的資料型別是unsigned int ,當它與負數相乘時,就會出現奇怪的結果——一個巨大的整數。於是每次if的條件基本上都成立。
所以只要改成這樣即可:
if((4-(int)temp.size())*nums[sub]>-sum) { return; }
這鴿了半個月的題目終於可以用回溯演算法切掉了!(開心)
開nmmmmmm心