不修改数组,时间复杂度达到O(n)
public class MoreThanHalfNumbers {
public static void main(String[] args) {
int a[]={1,2,2,3,4,5,62,2,2,2,2,10,2,2};
int key=a[0];
int times=0;
for(int i=1;i<a.length;i++)
{
if(times==0)
{
times=1;
}
if(key==a[i])
{
times++;
}
else
{
key=a[i];
times--;
}
}
System.out.println(key);
}
修改数组的前提下
public class MoreThanHalfNumbers {
/**
* @param args
*/
public static void main(String[] args) {
int a[]={1,2,2,3,4,5,62,2,2,2,2,10,2,2};
System.out.println(moreThanHalfNumbers(a,a.length));
}
private static int moreThanHalfNumbers(int[] a, int length) {
int middle=length>>1,start=0,end=length-1;
int index=partion(a,0,a.length-1);
while(index!=middle)
{
if(index>middle)
{
end=index-1;
index=partion(a,start,end);
}else
{
start=index+1;
index=partion(a,start,end);
}
}
int result=a[middle];
Check(a,result);
return result;
}
private static void Check(int[] a, int result) {
// TODO Auto-generated method stub
int count=0;
for(int i=0;i<a.length;i++)
{
if(a[i]==result)
{
count++;
}
}
if(count>(a.length>>1))
{
System.out.println(result+" 超过数的二分之一");
}
else
{
System.out.println("nod");
}
}
private static int partion(int[] a, int low, int high) {
// TODO Auto-generated method stub
int index=low+(int)Math.random()*(high-low+1);
int h=high;
int flag=a[index];
while(index<high)
{
while(index<high && a[high]>flag) high--;
if(index<high) a[index++]=a[high];
while(index<high && a[index]<flag) index++;
if(index<high)a[high--]=a[index];
}
a[index]=flag;
return index;
}
}