题目
问题描述
给定n个数,请找出其中相差(差的绝对值)最小的两个数,输出它们差的绝对值。
输入格式
输入第一行包含一个整数n。
第二行包含n个正整数,相邻整数之间使用一个空格分割。
输出格式
输出一个整数,表示答案。
样例1
输入:
5
1 5 4 8 20
输出:
1
说明:
相差最小的两个数是5和4,它们之间的差值是1。
样例2
输入:
5
9 3 6 1 3
输出:
0
说明:
有两个相同的数3,它们之间的差值是0。
数据规模和约定
对于所有评测用例,2<= n <= 1000,每个给定的整数都是不超过10000的正整数。
分析
1、首先接收数据到数组arr[i]中,数据长度为len;
2、i 的取值为从0到len-1,每次取值后计算arr[i]分别减去arr[i+1]、arr[i+2]、…、arr[len]的差值的绝对值,将结果保存到数组temp_sub[]中,然后求出temp_sub[]中的最小值保存到sub[i]中。第2步结束后,就已经对这组数据中的任意两个数据进行了求绝对值差值的操作了
3、sub[]数组中有len-1个数据,求出其中的最小值,即是这组数据中的最小差值。
代码
/*
20190815
ccf试题1:最小差值
*/
#include <iostream>
using namespace std;
int main(){
//接收数据
int len;
cin >>len;
int arr[len];
for(int i=0; i<len; i++){
cin >>arr[i];
}
//求最小差
int sub[len-1];
int temp_sub[len];
for(int i=0; i<len-1; i++){
for(int j=i+1; j<len; j++){
if(arr[i] > arr[j]){
temp_sub[j] = arr[i] - arr[j];
}
else{
temp_sub[j] = arr[j] - arr[i];
}
}
sub[i] = temp_sub[i+1];
for(int k=i+2; k<len; k++){
if(sub[i] > temp_sub[k]){
sub[i] = temp_sub[k];
}
}
}
//输出最小差
int min = sub[0];
for(int i=0; i<len-1; i++){
if(min > sub[i]){
min = sub[i];
}
}
cout <<min<<endl;
return 0;
}
总结
以正常逻辑进行了解答,代码的时间和空间复杂度都较高,最明显的是temp_sub[]数组存在空间上的浪费。且数组的索引变来变去,像i+1、i+2什么的,不便于阅读。
此次题目的结果是两个数差值的绝对值,即输出的数最小是0,所以在计算过程中如果遇到temp_sub[j] = 0;就可以直接输出0,然后return了,算是个小优化吧。