最快效率求出乱序数组中第k小的数。
用非线性的最快排序,也要要nlgn。还是太慢。
用分区思想:平均可以O(n)
求数组中出现次数超过半数的元素
算法1:排序后返回,a[n/2] 为O(nlogn)
算法2:hash统计
算法3:顺序统计,分区算法,平均O(n)
算法4:不同的数进行消除 O(n)
算法4:求次数超过半数的元素
int a[]= {1,2,5,5,5,3,5,4,5};
int ans=a[0];
int cnt=1;
for(int i=1;i<a.length;i++)
{
if(cnt==0)
{
ans=a[i];cnt=1;continue;
}
//有次数
if(ans!=a[i])
{
cnt--;
}
else cnt++;
}
System.out.println(ans);
算法4求半数以及以上的元素
int a[]= {1,2,5,5,5,3,5,4};
int ans=0;
int cnt=0;
int lastcnt=0;
for(int i=0;i<a.length;i++)
{
if(a[i]==a[a.length-1]) lastcnt++;
if(cnt==0)
{
ans=a[i];cnt=1;continue;
}
//有次数
if(ans!=a[i])
{
cnt--;
}
else cnt++;
}
if(lastcnt==a.length/2)
{
System.out.println(a[a.length-1]);
}
else {
System.out.println(ans);
}