1. 程式人生 > 實用技巧 >令人頭禿的bug總是源於基礎不牢------你知道vector.size()是unsigned int嗎

令人頭禿的bug總是源於基礎不牢------你知道vector.size()是unsigned int嗎

  還是前不久寫的《四樹之和》那題: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心