Quiz:有数组T[0 - n-1],对任一元素x,设S(x) = {i | T[i] = x}.当|S(x)| > n /2时,称x为T的主元素.请设计一个线型时间算法实现此算法.
note: O(n)
如果有时间就发发代码看看,没空交流下思想.
note: O(n)
如果有时间就发发代码看看,没空交流下思想.
解决方案 »
- Java正则表达式请教
- 100分球:如何通过JAVA程序的Runtime.getRuntime().exec运行netstat命令,得到6060这个端口所在的进程ID?
- 关于包和protected方法问题
- 实在是想不出办法了,只能请教高手了!!!开出手帮忙.........
- 关于FileInputStream.available()
- 我的applet为什么不能传进参数?
- 请问以下2个输入流的内容分别是什么?
- 是jdk的bug吗?
- 用jbuilder 编写的appliction 程序,如何独立于jbuilder 编译器之外运行?
- 初学者的一点迷惑请各位指教
- java threads , concurrency event etc..............
- 彩票方面小编程题!
"|S(x)|"的意思是S(x)的模,也就是个数.
没看出这句话对题目有什么作用,感觉废话一句。
它只是提出了一个概念,没说这个概念有啥用。我还可以在题目中加上“两条永不相交的直线,称为平行线”,然后就不告诉你“平行线”和题目有啥关系~~~~~~
for i=0 to n-1 {
temp = ++buffer[t[i]]
^^^^重点、精华
if (temp>max) max=temp
}
if max>n/2 则OK
for(int i=0;i<n;i++)++score[T[i]];
for(int i=0;i<n;i++)
if(score[i]>n/2){
System.out.println("{i|T[i]="+i+"}");
}
System.out.println("That's all");
看看puerbegger的,一样的思路。
*/
private static boolean hasMaster(int data[], int n)
{
int count=0; //保存计数
int seed; //保存参照元素
seed = data[0];
for(int i=1; i<n; i++)
{
if(seed == data[i]) //如果数据相同,计数加一
{
count++;
}
if(seed == data[i])
{
if(count>0)
{
count--; //如果数据不同,则计数减一
//相当于删除两个不同的元素
//不会对主元素造成影响
}
else
{
seed = data[i]; //计数为零时,seed不可能为主元素
//读入新数据
}
} //end of if
} //end of for
//因为最终得到的seed元素有可能是序列最末位的两个元素之一
//因此,这里还需要验证
count = 0;
for(int i=0; i<n; i++)
{
if (seed == data[i])
count++;
}
if(count>(n/2))
{
return true;
}
return false;
}
}
b) 分析
通过对问题目的性的研究,可以得到这样的一个结论:
在元素数组中,删去不同的两个元素,数组的主元素保持不变。
按照这样的思路,我们可以不断缩小问题的规模,最终使问题得解:
设置变量Seed用于存储当前候选元素,初始化为数组首元素a[0];
设置变量count用于控制候选元素,初始化为1;
从第二个元素a[1]开始遍历数组,并与Seed相比较:
相同,则count加1,读入下一个元素;
不同,则count减1,读入下一个元素:相当于删去两个不同元素,缩小问题规模;
如果count小于0则Seed不是主元素候选,读入下一个元素,count加1。
这样一次遍历之后,得到的Seed就是主元素的候选;
但因为最终得到的Seed元素有可能是序列最末位的两个元素之一,所以还需要验证。
我们再次遍历数组,得到Seed出现的次数,与总数的一半比较来验证。
-->
http://acm.zju.edu.cn/show_problem.php?pid=2132
-->
/*
** found 2005-11-2
** by kingly
**
*/#define test
#ifdef test
#include<iostream.h>
#include<fstream.h>
#endif#include<stdio.h>int main()
{
#ifdef test
freopen("in.txt", "r" ,stdin);
freopen("out.txt","w",stdout);
//ofstream cout("out.txt");
#endif
int counter,answer,n,data;
int bb = 0;
while(1)
{
scanf("%d",&n);
if(n<0)break;
counter=0;
for(int i=0;i<n;i++)
{
scanf("%d",&data);
if(!counter){
answer = data;
counter=1;
continue;
}
if(answer==data){
++counter;
}else{
--counter;
}
}
printf("%d\n",answer);
}
}
恩。
既然这样,那也不一定要排序的啊。
直接找到数列中第n大的数字,时间复杂度为O(n)。
请设计一个线型时间算法实现此算法.
这个此算法是什么?
还是看了liuguangliang才明白的
liuguangliang思路不错,应该是正解吧