问题描述:
数组有N-2个数字,数字的范围为1 ... N,没有重复的元素,要求打印缺少的2个数字,不可以用额外的空间
the code:
#include <stdio.h>
#include <math.h>
//数组有N-2个数字,数字的范围为1 ... N,没有重复的元素,要求打印缺少的2个数字,不可以用额外的空间。
static void FindTwoMissedElements(int *arr, int n)
{
int N = n+2;
int sum = (N+1)*N/2;
int qsum = sum*(2*N+1)/3;
int i, a_b;
for(i=0; i<n; i++)
{
sum -= arr[i];
qsum -= arr[i]*arr[i];
}
a_b = (int)sqrt(2*qsum - sum*sum);
printf("a=%d, b=%d\n", (sum+a_b)>>1, (sum-a_b)>>1);
}
int main()
{
int arr[] = {1,2,3,5,6,7,9};
FindTwoMissedElements(arr, 7);
return 0;
}
本文介绍了一种在不使用额外空间的情况下找出长度为N-2的数组中缺失的两个1到N范围内的整数的方法。该算法通过计算数组元素的一次方和二次方和,再利用数学公式反推出缺失的两个数。
492

被折叠的 条评论
为什么被折叠?



