最快效率求出乱序数组中第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);
}
博客探讨了如何快速找到乱序数组中第k小的数,提出了一种平均时间复杂度为O(n)的分区思想方法。此外,还介绍了四种算法来寻找数组中出现次数超过半数的元素,包括排序、哈希统计、顺序统计和消除不同数的方法,并给出了具体的代码实现。这些算法在处理大数据集时能有效提高效率。
1383

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



