原题如下
多数元素
第一种解法:
Class solution{
public int majorityElement(int[] nums){
//先计算出判断的界定值
int dec=nums.length/2;
//用HashMap来存储记录,泛型限制为Integer,key为数组中的某个数,value为该数在数组中出现的次数
Map<Integer,Integer> map=new HashMap<Integer,Integer>();
//遍历数组
for(int i = 0; i < nums.length; i++){
//如果map中没有这个key,也就是还没有存储过这个节点,也就是在遍历中出现的新的元素
if(!map.containsKey(nums[i])
//存入map
map.put(nums[i] , 1);
else
//存在这个key的时候,让它的vlaue加1
map.put(nums[i] , map.get(nums[i]) + 1);
}
//用keyset来,遍历这个HashMap
for(Integer i: map.KeySet()){
//但遍历到某个节点的value大于界定值
if(map.get(i) > dec)
//直接返回这个key
return i;
}
//若没有哪个数可以大于界定值,返回0,在正常开发中用-1更好
return 0;
}
}
第一种解法其实不是特别好,内存消耗比较大,耗时也长
第二种解法:
Class solution{
public int majorityElement(int[] nums){
//创建一个计数器
int count = 0;
//创建一个比较值
int num = nums[0];
//遍历数组
for(int i = 0;i < nums.length; i++){
//如果比较值与现在正在遍历的数组的数相等,
if(num == nums[i])
//则计数器加一
count++;
else{
//否在减一
count--;
//确保取下个数时不会越界
if(i+1<nums.length)
//若计数器等于0了,则需要下个数进行计数
if(count == 0)
//比较值变为下个数
num = nums[i+1];
}
}
//返回最终结果
return num;
}
}
第二种比较推荐 是其他人的思路,在这里做个搬运,(给出这种想法的人没有提到可能数组下标越界的情况)
但可以看出时间明显缩短
手持两把锟斤拷,口中疾呼烫烫烫。脚踏千朵屯屯屯,笑看万物锘锘锘。
——网络