sort函數居然能改變元素值?記一次有趣的Bug——四數之和
坐標leetcode:
我想都不想直接深度優先搜索暴力求解:
class Solution { public: vector<vector<int>> res; //答案 int sum =0; //temp中的總和 vector<int> temp;//用於存儲一個解 bool check(vector<int>&a,vector<int> &b)//用於判斷兩個解是否相同(因為res中已經排序所以直接比較 很方便) { for(int i = 0;i<4;i++) { if(a[i]!=b[i]) return false; } return true; } void dfs(vector<int>&nums,int sub,int target)//sub為當前下標 { if(temp.size()==4) { if(sum == target) { for(int i =0;i<res.size();++i) //判斷重複 若重複則不加入此解 { if(check(res[i],temp)) return; } sort(temp.begin(),temp.end()); res.push_back(temp); } return; } if(sub>=nums.size()) return ; //存入當前下標的元素 sum+=nums[sub]; temp.push_back(nums[sub]); dfs(nums,sub+1,target); //不存入當前下標的元素 sum-=nums[sub]; temp.erase(temp.end()-1); dfs(nums,sub+1,target); } vector<vector<int>> fourSum(vector<int>& nums, int target) { dfs(nums,0,target); return res; } };
我自信地按下了提交按鈕,結果連示例都沒過得了!!?
而且結果很讓人問號:
這···怎麼會出現[-2,-1,-1,2]這個解??
於是我把sort注釋掉 把判重也注釋掉:
class Solution { public: vector<vector<int>> res; //答案 int sum =0; //temp中的總和 vector<int> temp;//用於存儲一個解 bool check(vector<int>&a,vector<int> &b)//用於判斷兩個解是否相同(因為res中已經排序所以直接比較 很方便) { for(int i = 0;i<4;i++) { if(a[i]!=b[i]) return false; } return true; } void dfs(vector<int>&nums,int sub,int target)//sub為當前下標 { if(temp.size()==4) { if(sum == target) {
//sort(temp.begin(),temp.end());
//for(int i =0;i<res.size();++i) //判斷重複 若重複則不加入此解 //{ // if(check(res[i],temp)) // return; // } res.push_back(temp); } return; } if(sub>=nums.size()) return ; //存入當前下標的元素 sum+=nums[sub]; temp.push_back(nums[sub]); dfs(nums,sub+1,target); //不存入當前下標的元素 sum-=nums[sub]; temp.erase(temp.end()-1); dfs(nums,sub+1,target); } vector<vector<int>> fourSum(vector<int>& nums, int target) { dfs(nums,0,target); return res; } };
好的,結果驚了,就是正確答案:
於是我開vs復原了這題的解,同樣是這個奇怪的結果。
這···難道sort改變了元素值的大小???
然後我單獨試驗了sort函數,發現函數並沒有問題。
那麼問題來了。。。。。。Bug出在哪裡?為什麼會出現sort函數改變了元素值的假象?
於是我開始了不同的嘗試探索問題的原因。
一、改變記錄sum的方法
我將全局變數sum去掉,改為需要的時候當場對temp求和。
按道理,結果應該不會改變,但是卻改變了。[-2,-1,-1,2]這個解變為了[-1,-1,0,2]。
這說明dfs的執行邏輯出現了問題。
二、用大腦運行程式
這果然是個好辦法!。。。
我從頭到尾思考了很多遍,感覺邏輯沒問題啊。
於是我又從頭到尾思考了很多遍,
終 於 知 道 bug 到 底 在 哪 里 了 !
這一切都是因為全局變數temp!
我以為temp.erase(temp.end()-1)就能夠把剛才加入的元素給彈掉。。
結果並不是!!因為temp已經排序過了!!!最後一個元素不是在這個遞歸層加進去的那個元素!!!
vector<int> ttemp = temp; sort(ttemp.begin(), ttemp.end());
for(int i =0;i<res.size();++i)
{
if(check(res[i],ttemp))
return;
}
res.push_back(ttemp);
哈!哈!哈!這樣總算能過吧!這程式碼已經絕!對!不!會!有!b!u!g!了!哈!哈!哈!
退役了再見