您的位置:首页 > 其它

LintCode_主元素

2015-10-28 21:46 253 查看
问题描述:

给定一个整型数组,找出主元素,它在数组中的出现次数严格大于数组元素个数的二分之一。

样例:给出数组[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];
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: