ccf试题1:最小差值

ccf试题1:最小差值

题目

问题描述
      给定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了,算是个小优化吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值