leetcode周赛题

题目如下:

给定一个由不同整数组成的数组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 > ret;
    sort(arr.begin(),arr.end());
	
	int min = arr[1] - arr[0];
	vector 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 arr(4,0);
	arr[0] = 4;
	arr[1] = 2;
	arr[2] = 1;
	arr[3] = 3;
	
    vector > ret;
    sort(arr.begin(),arr.end());
	
	int min = arr[1] - arr[0];
	vector 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] <

比较有意思的现象如下:
这个是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...

你可能感兴趣的:(leetcode,leetcode周赛)