问题描述:
给定一个整型数组,找出主元素,它在数组中的出现次数严格大于数组元素个数的二分之一。
样例:给出数组[1,1,1,1,2,2,2],返回 1
挑战:要求时间复杂度为O(n),空间复杂度为O(1)
算法:
方法一:这种做法的缺点是,nums中有很大的数时,要求num[ ]数组的内存空间也要很大
public int majorityNumber(ArrayList<Integer> nums) {
// write your code
int [] num=new int[200];
int result=0;
for(int i:nums){
num[i]++;
}
for(int j=0;j<num.length;j++){
if(num[j]>nums.size()/2){
result=j;
break;
}
}
return result;
}
方法二:其实,这就是排序的另一种考察方式;我们可以先将nums排序,排序完后的数列中中间的数字肯定是出现次数大于nums长度的二分之一的数;
public int majorityNumber2(ArrayList<Integer> nums){
if(nums==null||nums.size()==0){
return 0;
}
int[] temp=new int[200];
temp[0]=nums.get(0);
int pos=0;
//插入排序
for(int i=1;i<nums.size();i++){
pos=i-1;
while(pos>=0&&nums.get(i)>temp[pos]){
temp[pos+1]=temp[pos];
pos--;
}
temp[pos+1]=nums.get(i);
}
return temp[nums.size()/2];
}