Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays “查找一个元素”;k";这样就有了",;k";未排序数组中大于此元素的元素_Arrays - Fatal编程技术网

Arrays “查找一个元素”;k";这样就有了",;k";未排序数组中大于此元素的元素

Arrays “查找一个元素”;k";这样就有了",;k";未排序数组中大于此元素的元素,arrays,Arrays,雅高专访: 输入:整数数组(未给定范围),未排序,大小为n 输出:在数组中找到一个元素“k”,这样数组中正好有大于该元素的“k”个元素 例如,如果阵列为: 一,。 [4,3,6,9,10,22] 这里的输出是4 二,。 [4,3,6,9,10] 输出:没有找到这样的数字 这个问题可以很容易地通过在O(n logn)时间内排序来完成,但是我被要求在O(n)时间内完成(如果O(logn)可能的话) 有人帮了忙,下面是解决方案 请注意:“K”不能大于数组的大小。 我们将有一个大小等于给定数组的计数数组

雅高专访:

输入:整数数组(未给定范围),未排序,大小为n

输出:在数组中找到一个元素“k”,这样数组中正好有大于该元素的“k”个元素

例如,如果阵列为:

一,。 [4,3,6,9,10,22] 这里的输出是4

二,。 [4,3,6,9,10] 输出:没有找到这样的数字


这个问题可以很容易地通过在O(n logn)时间内排序来完成,但是我被要求在O(n)时间内完成(如果O(logn)可能的话)

有人帮了忙,下面是解决方案

请注意:“K”不能大于数组的大小。 我们将有一个大小等于给定数组的计数数组

assuming indexes start from 1 
for(i=1;i<=n;i++)
{
  if(a[i]<=n)
    count[a[i]-1]++;
  else
    count[n]++;
}



boolean flag=false;
 for(i=n-1;i>=1;i--)
 {
    if(count[i]==i)
    {
      flag=true;
      System.out.println("k: "+i);

    }
 }

 if(flag==false)
      System.out.println("No such number found);

}
假设索引从1开始
对于(i=1;i
int[]计数=新的int[n+2];
对于(int k=0;k0&&(0==count[k]|k!=c);c+=count[k--]);
System.out.println(0==k?“未找到”:“找到:”+k);

祝你在家庭作业中好运,如果你遇到了真正的编程问题,请告诉我们你可能无法在O(log(n))时间内完成。如果数组未排序,你将必须查看每个元素一次,即O(n)@Blender-我读了你建议的链接,但我想这适用于你被提供了“k”值的问题。这里没有提供“k”值,我们必须找到“k”值是O(logn)是不可能的:)在这个算法中
k
在哪里?数组的边界是什么?另请参考来源。打印的输出为“k”。“k”的值不是预先给定的,我们必须找到它。输入数组是[1..n]它不可能像写的那样工作。忽略数组中负整数的明显问题,下面是一个反例:[2,5,6]。您的计数[0..3]数组看起来像[0,1,0,2],您将无法输出正确的答案“2”。不过,你的思路是对的。
int[] count = new int[ n + 2 ];
for ( int k = 0; k < n; ++k )
    ++count[ Math.min( n + 1, Math.max( 0, a[ k ] + 1 ) ) ];
int k = n, c = count[ n + 1 ];
for ( ; k > 0 && ( 0 == count[ k ] || k != c ); c += count[ k-- ] );
System.out.println( 0 == k ? "not found" : "found: " + k );