坐标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!了!哈!哈!哈!

退役了再见

sort函数居然能改变元素值?记一次有趣的Bug——四数之和的更多相关文章

  1. STL sort 函数实现详解

    作者:fengcc 原创作品 转载请注明出处 前几天阿里电话一面,被问到STL中sort函数的实现.以前没有仔细探究过,听人说是快速排序,于是回答说用快速排序实现的,但听电话另一端面试官的声音,感觉不 ...

  2. STL sort 函数实现详解 ZZ

    前几天阿里电话一面,被问到STL中sort函数的实现.以前没有仔细探究过,听人说是快速排序,于是回答说用快速排序实现的,但听电话另一端面试官的声音,感觉不对劲,知道自己回答错了.这几天特意看了一下,在 ...

  3. jquery获取、改变元素属性值

    //标签的属性称作元素属性,在JS里对应的DOM对象的对应属性叫DOM属性.JS里的DOM属性名有时和原元素属性名不同. //==================================操作元 ...

  4. java 数据类型:集合接口Collection之List~ArrayList:remove移除;replaceAll改变原有值;sort排序;迭代器listIterator();

    什么是List集合: 特点: 元素有序可重复的集合. 集合中每个元素都有其对应的顺序索引. List集合默认按元素的添加顺序设置元素的索引,索引从0开始.   List接口的常用方法: List可以使 ...

  5. /编写一个函数,要求从给定的向量A中删除元素值在x到y之间的所有元素(向量要求各个元素之间不能有间断), 函数原型为int del(int A ,int n , int x , int y),其中n为输入向量的维数,返回值为删除元素后的维数

    /** * @author:(LiberHome) * @date:Created in 2019/2/28 19:39 * @description: * @version:$ */ /* 编写一个 ...

  6. sort函数用法

    原文链接:http://blog.csdn.net/csust_acm/article/details/7326418 sort函数的用法 做ACM题的时候,排序是一种经常要用到的操作.如果每次都自己 ...

  7. Perl Sort函数用法总结和使用实例

    一) sort函数用法 sort LISTsort BLOCK LISTsort SUBNAME LIST sort的用法有如上3种形式.它对LIST进行排序,并返回排序后的列表.假如忽略了SUBNA ...

  8. STL——sort函数简介

    参考:http://blog.csdn.net/s030501408/article/details/5329477 0)与C标准库qsort的比较:http://bbs.csdn.net/topic ...

  9. SORT函数的使用方法(转载)

    sort函数的用法(转载出处:http://blog.sina.com.cn/s/blog_6439f26f01012xw3.html) 做ACM题的时候,排序是一种经常要用到的操作.如果每次都自己写 ...

随机推荐

  1. C语言内存泄露很严重,如何应对?

    摘要:通过介绍内存泄漏问题原理及检视方法,希望后续能够从编码检视环节就杜绝内存泄漏导致的网上问题发生. 1. 前言 最近部门不同产品接连出现内存泄漏导致的网上问题,具体表现为单板在现网运行数月以后,因 ...

  2. 为什么 list(range) 比 [i for i in range()] 快?

    为什么 list(range) 比 [i for i in range()] 快? t0 = time.time() list(range(100000)) print(time.time()-t0) ...

  3. SpiderMonkey教程

    https://technotales.wordpress.com/2009/06/07/spidermonkey-introduction/ https://developer.mozilla.or ...

  4. Spine学习七 - spine动画资源+ Unity Mecanim动画系统

    前面已经讲过 Spine自己动画状态机的动画融合,但是万一有哥们就是想要使用Unity的动画系统,那有没有办法呢?答案是肯定的,接下来,就说说如何实现: 1. 在project面板找打你导入的Spin ...

  5. 【pytest】(四) pytest的一些其他的运行用法

    1. 可以设置当失败N个后停止测试 pytest -x 是当第一个失败产生后,停止 pytest --maxfail=2, 这里就是当失败2个用例后,停止测试 2.pytest 在命令行模式下支持多种 ...

  6. Black & White(尺取)

    链接:https://ac.nowcoder.com/acm/contest/893/F来源:牛客网 * 第一行一个整数 T ,表示接下来有 T 个样例.* 首先输入n,m,表示S串的长度n和操作次数 ...

  7. xAxis&yAxis

    const option = { color: ['#546570', '#2f4554', '#61a0a8'], xAxis: { type: 'category', data: ['Mon', ...

  8. Jmeter4.0安装教程

    1. 检查安装环境 1.1 Jdk要求 JDK版本:1.6+ 1.2 检查是否安装JDK win  +  R  快捷键打开运行,输入cmd 打开面板,在面板中输入  java -version,出现如 ...

  9. Activiti7 绑定业务主键以及流程定义 流程实例的挂起和激活

    绑定业务主键businessKey /** * 绑定业务主键 */ @Test public void bindingBusinessKey() { // 获取RuntimeService Runti ...

  10. 给EmpMapper开放Restful接口

    本文例程下载:https://files.cnblogs.com/files/xiandedanteng/gatling20200428-3.zip 接口控制器代码如下: 请求url和响应都写在了每个 ...