数组中两个元素差的绝对值最小

#include <stdio.h>
#include <stdlib.h>

/*
	给定一个含有n个元素的整型数组,
	找出数组中的两个元素x和y使得abs(x - y)值最小
*/

/*
	思路:
	排序,
	然后遍历数组比较相邻值相减得到的值
*/
typedef struct{
	int num1;
	int num2;
}TwoNumber;

TwoNumber getTNumber(int* numbers, int length);
int cmp(const void *a,const void *b);
int abs(int number);

int main(){
	int n;
	while (printf("Please input n:\n"), fflush(stdin), scanf("%d", &n) != EOF){
		if (n < 2){
			printf("Please input a bigger number.\n");
			continue;
		}
		int *numbers = (int*)malloc(n*sizeof(int));
		printf("Please input %d numbers: \n",n);
		for (int i = 0; i < n; ++i)
			scanf("%d", numbers + i);
		TwoNumber tNumber = getTNumber(numbers,n);
		printf("%d %d\n",tNumber.num1,tNumber.num2);
	}
	system("pause");
	return 0;
}

TwoNumber getTNumber(int* numbers, int length){
	qsort(numbers,length,sizeof(int),cmp);
	int absMinus = abs(numbers[0] - numbers[1]);
	int index = 0;
	for (int i = 1; i < length - 1; ++i){
		if (absMinus > abs(numbers[i] - numbers[i + 1])){
			absMinus = abs(numbers[i] - numbers[i + 1]);
			index = i;
		}
	}
	TwoNumber tNumber;
	tNumber.num1 = numbers[index];
	tNumber.num2 = numbers[index + 1];
	return tNumber;
}

int cmp(const void *a, const void *b){
	return *(int*)a - *(int*)b;
}

int abs(int number){
	if (number > 0)
		return number;
	else
		return -number;
}

  

时间: 2024-10-09 21:17:28

数组中两个元素差的绝对值最小的相关文章

求数组中两个元素差的最大值

找到最大值找到最小值,然后相减即可. 1.如果是说,前面的减去后面的,差的最大值? 2.如果是说,后面的减去前面的,差的最大值? 这两个问题就不一样了. 基础的想法可以用暴力.但是有更好的方法. 针对1,从后往前遍历数组,记录遍历过的数组元素的最小值,用当前元素相减. 针对2,从前往后遍历数组,记录遍历过的数组元素的最小值,用当前元素相减.

交换数组中两个元素的位置,元素包括key和value 一维数组

/*author: [email protected]description: 交换数组中两个元素的位置,元素包括key和value,具体用法见下面的例子*/$arr = array(11=>'a',22=>'b',33=>'c',44=>'d');$res = array_exchange($arr, 11 ,33); //example:echo '<pre>';print_r ($res);echo '</pre>'; function array_e

Java泛型01--任意数组中两元素交换

package com.zl.generic; /** * 交换“任意”数组 中两个元素 */ public class GenericSwapArray { public static void main(String[] args) { swap(new String[]{"1","2","3"},1,2); } public static <T> T[] swap(T[] t,int i,int j) { System.out.

相邻元素差的绝对值都是1,在这样的数组中找目标元素

有这样一个数组A,大小为n,相邻元素差的绝对值都是1.如:A={4,5,6,5,6,7,8,9,10,9}.现在,给定A和目标整数t,请找到t在A中的位置.除了依次遍历,还有更好的方法么? 这道题目的解法非常有趣. 数组第一个数为array[0], 要找的数为y,设t = abs(y - array[0]).由于每个相邻的数字之差的绝对值为1.故第t个位置之前的数肯定都比y小.因此直接定位到array[t],重新计算t,t = abs(y – array[t]),再重复上述步骤即可.这种算法主要

整数数组中两两之差绝对值最小的值

题目1: 有一个整数数组,请求出两两之差绝对值最小的值,记住,只要得出最小值即可,不需要求出是哪两个数. 题目2:请求出最小连续子序列绝对值和,也就是求连续子序列之和的绝对值最小值 针对问题1: 方法<1>:暴力的方式.遍历所有的两个数的差,记录最小值.算法的复杂度O(n2) 方法<2>:两个数要想差的绝对值最小,肯定是需要两个数大小相近.故有思路:先对数组进行排序,然后遍历一遍,相邻的数相减,记录绝对值最小的数. 方法<3>:将现在的问题进行转化: 设这个整数数组是a

有这样一个数组A,大小为n,相邻元素差的绝对值都是1。

有这样一个数组A,大小为n,相邻元素差的绝对值都是1.如:A={4,5,6,5,6,7,8,9,10,9}.现在,给定A和目标整数t,请找到t在A中的位置.除了依次遍历,还有更好的方法么? 思路:数组第一个数为array[0], 要找的数为y,设t = abs(y - array[0]).由于每个相邻的数字之差的绝对值为1.故第t个位置之前的数肯定都比y小.因此直接定位到array[t],重新计算t,t = abs(y – array[t]),再重复上述步骤即可.这种算法主要利用了当前位置的数与

(笔试题)将数组分成两组,使两组的和的差的绝对值最小

题目: 数组中的数分为两组,给出一个算法,使得两个组的和的差的绝对值最小数组中的数的取值范围是0<x<100,元素个数也是大于0,小于100比如a[]={2,4,5,6,7},得出的两组数{2,4,,6}和{5,7},abs(sum(a1)-sum(a2))=0; 比如{2,5,6,10},abs(sum(2,10)-sum(5,6))=1,所以得出的两组数分别为{2,10}和{5,,6}. 思路: 初看问题,感觉好像是个组合问题,通过暴力穷举解决问题. 但仔细想想,问题可以转换成,从数组中找

Single Number 数组中除了某个元素出现一次,其他都出现两次,找出这个元素

Given an array of integers, every element appears twice except for one. Find that single one. Note:Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory? 数组中除了某个元素出现一次,其他都出现两次,找出只出现一次的元素. 一个数字和自己异或

有两数组A、B,长度分别为m、n。用不超过m+n的比较次数找到两个数组中的相同元素

今天碰到一道笔试题:有两数组A.B,长度分别为m.n.用不超过m+n的比较次数找到两个数组中的相同元素.当时没做出来,我现在给出C#版本,算是弥补一点遗憾. using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace SortAB { class Program { static void Main(string[] args) { int[] A = Random