我计算了每对之间的差异,然后仅在该位置存储了与该元素相关的最大差异,例如数组为1 2 3,因此a [0] = 2,a [1] = 1 ,因为1的差异最大为3,差异2最大为3,现在无论我做什么操作我都会将数组大小减少1,所以现在我计算最大差值并将其放在第0个索引中,之后我运行一个循环,直到减少数组的大小并计算出这个最大值出现的次数,但这种方法花费的时间太长,有人可能会提出一些简单的逻辑。输入的形式是 没有测试用例例如2 第一个数组中没有元素 第一个数组中最大的对数 第二个数组中没有元素 第二个数组中元素的最大数量
#include <stdio.h>
#include<math.h>
int max=0;
int main()
{
int test_no, n1,n2,i,j,a,b,count1=1,count2=1;
scanf("%d",&test_no);
printf("\n");
scanf("%d",&n1);
printf("\n");
int arr1[n1];
for(i=0;i<n1;i++)
{
scanf("%d ",&arr1[i]);
}
for(i=0;i<n1-1;i++)
{
for(j=i+1;j<=n1-1;j++)
{
a=abs(arr1[i]-arr1[j]);
if(max<=a)
max=a;
}
arr1[i]=max;
max=0;
}
int temp;
max=arr1[0];
for(i=1;i<n1-1;i++)
{
if(max<arr1[i])
{
temp=max;
max=arr1[i];
arr1[i]=temp;
arr1[0]=max;
}
}
for(i=1;i<n1-1;i++)
{
if(arr1[i]==arr1[0])
{
count1++;
}
}
printf("\n");
scanf("%d",&n2);
int arr2[n2];
max=0;
for(i=0;i<n2;i++)
{
scanf("%d ",&arr2[i]);
}
for(i=0;i<n2-1;i++)
{
for(j=i+1;j<=n2-1;j++)
{
a=abs(arr2[i]-arr2[j]);
if(max<=a)
max=a;
}
arr2[i]=max;
max=0;
}
temp=0;
max=arr2[0];
for(i=1;i<n2-1;i++)
{
if(max<arr2[i])
{
temp=max;
max=arr2[i];
arr2[i]=temp;
arr2[0]=max;
}
}
for(i=1;i<n2-1;i++)
{
if(arr2[i]==arr2[0])
{
count2++;
}
}
printf("%d \n",count1);
printf("%d",count2);
return 0;
}
答案 0 :(得分:1)
对数组进行排序(这需要n log n时间)。
现在最大差异显然是最后一个元素的值减去第一个元素的值。
要获得相同的差异,您需要相同的第一个元素和相同的结束元素 * ,这样您只需要计算有多少元素等于首先(比如4),有多少元素等于最后一个(比如说3),并取两个值中较小的一个(这里是3)。
size_t i;
for (i = 1; i < arrayLength/2; i++) {
if ((sortedArray[i] != sortedArray[0])
||
(sortedArray[n-1-i] != sortedArray[n-1])) {
break;
}
}
// i is now the number you need.
要在C中对数组进行排序,您还可以使用现成的库函数。
或者您可以在O(N)时间内完成此操作,只需扫描数组:
int minVal = INT_MIN;
int maxVal = INT_MAX;
int cntMin = 0;
int cntMax = 0;
for (i = 0; i < n; i++) {
if (arr[i] < minVal) {
minVal = arr[i];
}
if (arr[i] > maxVal) {
maxVal = arr[i];
}
if (arr[i] == minVal) { cntMin++; }
if (arr[i] == maxVal) { cntMax++; }
}
if (minVal == maxVal) {
return n/2;
}
return min(cntMin, cntMax);
示例:
0 0 0 0 1 2 3 4 5 6 6 6
最大差异为6,可以找到3次。
0 1 2 3 4 5 6 6 6
最大差异仍然是6,并且只能找到一次。
如果你想计算所有可能的对(例如在[0 1 ,0 2 ,6 1 ,6 2 ,6 3 ]你想拥有(0 1 ,6 1 )...... (0 2 ,6 3 )),即使你关于删除元素的注释似乎另有说明,那么代替返回cntMin的最小值和cntMax,只需返回他们的产品。如果它们相等,则返回N *(N-1))。
-
(*)与两个不同的数字得到相同的差异,其中一个必须小于初始范围的最小值或大于最大值,这是矛盾的。例如。要获得6而不是6和0,你需要7和1,或5和-1。但是7超过6,-1小于0.因此,一旦包含7或-1,你的数组的最大差异不再是6。
答案 1 :(得分:1)
您需要做的就是计算阵列中最小和最大数量的次数。完成后,通过简单的乘法找到对的数量。
这可以这样做:
#include <stdio.h>
#include <limits.h>
#define N 7
int main(void) {
int arr[N] = {1, 2, 1, 4, 1, 5, 5};
int max = INT_MIN;
int min = INT_MAX;
int i;
int countmax = 0;
int countmin = 0;
for (i=0; i < N; ++i)
{
if (arr[i] > max)
{
// Found new max value --> reset counter to 1
countmax = 1;
max = arr[i];
}
else if (arr[i] == max)
{
// Found same max value --> increment counter
countmax++;
}
if (arr[i] < min)
{
countmin = 1;
min = arr[i];
}
else if (arr[i] == min)
{
countmin++;
}
}
if (max == min)
{
// Special case: All elements are the same
printf("%d pairs with difference 0 found\n", N*(N-1)/2);
else
{
printf("%d pairs with difference %d found\n", countmin * countmax, abs(max-min));
}
return 0;
}
输出:
6 pairs with difference 4 found