题目如下:
给定一个由不同整数组成的数组arr,找到具有任意两个元素的最小绝对差的所有元素对,并且以升序(相对于对内部而言)返回对列表,每对[a,b]跟随。
a,b 来自arr
a < b
b - a等于arr中任意两个元素的最小绝对差
示例:
输入:arr = [4 , 2, 1 ,3]
输出:[[1,2],[2,3],[3,4]]
约束:
2 <= arr.length <= 10^5
-10^6 <= arr[i] <= 10 ^6
笔者自己答案如下:
vector<vector<int> > ret;
sort(arr.begin(),arr.end());
int min = arr[1] - arr[0];
vector<int> minArr(2,0);
minArr[0] = arr[0];
minArr[1] = arr[1];
ret.push_back(minArr);
for(int i = 2; i < arr.size(); ++i){
int temp = arr[i] - arr[i-1];
if(temp < min){
min = temp;
ret.clear();
minArr[0] = arr[i-1];
minArr[1] = arr[i];
ret.push_back(minArr);
}else if(temp == min){
minArr[0] = arr[i-1];
minArr[1] = arr[i];
ret.push_back(minArr);
}
}
调研一个现象如下:
vector<int> arr(4,0);
arr[0] = 4;
arr[1] = 2;
arr[2] = 1;
arr[3] = 3;
vector<vector<int> > ret;
sort(arr.begin(),arr.end());
int min = arr[1] - arr[0];
vector<int> minArr(2,0);
minArr[0] = arr[0];
minArr[1] = arr[1];
ret.push_back(minArr);
for(int i = 2; i < arr.size(); ++i){
int temp = arr[i] - arr[i-1];
cout << "temp:" << temp << endl;
cout << "min :" << min << endl;
if(temp < min){
min = temp;
ret.clear();
minArr.clear();
minArr[0] = arr[i-1];
minArr[1] = arr[i];
ret.push_back(minArr);
}else if(temp == min){
minArr.clear();
minArr[0] = arr[i-1];
minArr[1] = arr[i];
cout << minArr[0] << " "<< minArr[1] << endl;
ret.push_back(minArr);
cout << minArr[0] << " "<< minArr[1] << endl;
for(int i = 0; i < ret.size(); ++i){
cout << "ret[i].size() :" << ret[i].size() << endl;
for(int j = 0; j < ret[i].size(); ++j){
cout << ret[i][j] <<endl;
}
}
}
}
比较有意思的现象如下:
这个是https://tool.lu/coderunner C++在线编译器的上面程序的结果
temp:1
min :1
2 3
2 3
ret[i].size() :2
1
2
ret[i].size() :0
temp:1
min :1
3 4
3 4
ret[i].size() :2
1
2
ret[i].size() :0
ret[i].size() :0
sandbox> exited with status 0
在temp == min的分支中,先调用了minArr的clear函数,接着给minArr赋值,根据运行之后的结果可知赋值成功了,但接下来把minArr插到ret这个Vector中却失败了,所以这是为什么呢?
Vector的Clear函数:
删除vector中所有的元素(这些元素将被销毁),并且使这个容器的size变成0;
不会发生重新分配并且vector容器的容量不会因为调用这个函数而发生改变,强制重新分配的典型替代方法是使用swap函数。
vector push_back函数会自动开辟空间来存储值,而[]函数不会,故在使用clear函数之后 建议使用push_back函数。
swap函数用法没有试验。
经测试得出结论:
笔者当初真的以为这个问题是一个语法问题,思前想后找不到一个合理的解释。
emmmm...经过测试,leetcode网站,以及上边的这个在线编译器均没有发现vector [] 使用越界问题,
用Visual Studio 2017 就会报出这个越界问题。
emmmm...