我有一个整数元素数组。我需要按值找到一个平均元素。元素的数量是奇数,元素不能重复。 例如,我有一个数组A [5] = {100,43,55,34,68}。所以元素将是55.问题是我需要保留我的数组,我不能使用任何额外的数组,我也不能排序这个数组。
我正在考虑找到数组的平均值,然后找到与此值最接近的元素,但对于真正不同的数字,它将无效。
答案 0 :(得分:0)
如果你想在使用恒定内存量的同时执行这项任务(我认为这就是你所说的,不允许使用额外的数组),那么在线性时间内完成这项任务是不可能的。
更重要的是,如果不改变阵列并且不允许就地排序,则也不可能在O(nlogn)
时间内执行。
你留下了天真的方法:
int NaiveFindMedian(int[] A){
int i, j, count;
for (i = 0; i < A.length){
count = 0;
for (j = 0; j < A.length; j++)
if (A[j] < A[i]) count++;
if (count == (A.length-1)/2) return i;
}
}
显然这是昂贵的计算(O(n^2)
),但这是使用O(1)
内存的代价。如果您允许O(n)
内存,则可以在O(n)
时间内执行此任务。
答案 1 :(得分:0)
使用此代码查找数组的平均值和数组元素中的最近值
import java.util.Scanner;
public class AA {
public static void main(String[] args) {
float b=0,j = 0;
float c;
int l = 0;
Scanner s1=new Scanner(System.in);
int x=s1.nextInt();
int[]a =new int[x];
for(int i=0;i<a.length;i++)
{
a[i]=s1.nextInt();
}
for(int i=0;i<a.length;i++)
{
b=b+a[i];
}
float g=a.length;
c=b/g;
System.out.println("Average="+c);
for(int k=0;k<a.length;k++)
{
for(int h=1+k;h<a.length;h++)
{
if(b>a[h])
{
b=a[h];
int temp=a[h];
a[h]=a[k];
a[k]=temp;
}
}
if(l<a.length-1)
{
b=a[++l];
}
}
for(int i=0;i<a.length;i++)
{
if(c<a[i])
{
float v=a[i]-c;
float s=a[i-1]-c;
if(s<0)
{
j=s*(-1);
}
if(v==j)
{
System.out.println("Array Element NearBy="+a[i-1]+" or "+a[i]);
}
else if(v>j)
{
System.out.println("Array Element NearBy="+a[i-1]);
}
else
{
System.out.println("Array Element NearBy="+a[i]);
}
break;
}
}
}
}