我的解题过程
解题思路
刚开始做的时候看到输入示例中数字都是十以内,天真的只设置了长度为十的数组…后来发现如果输入范围是全体实数,使用数组需要用到双循环,但题目要求时间复杂度O(N)内完成,受到第1题两数之和的启发,采用哈希表完成,哈希函数H(key) = key (key为输入的数字,value为出现的次数)
java代码
class Solution {
public int majorityElement(int[] nums) {
//创建哈希表
HashMap<Integer,Integer> A = new HashMap<Integer,Integer>();
int i;
//遍历输入数组
for(i=0;i<nums.length;i++){
//判断哈希表中是否存在键值等于输入元素值的项
if (A.containsKey(nums[i])){
//若有,该key对应的value值+1
A.replace(nums[i],A.get(nums[i])+1);
}
else{
//若没有,则将该元素做为key插入,value值为1
A.put(nums[i],1);
}
}
//迭代哈希表
for(Integer j:A.keySet()){
//寻找value值符合要求的,输出其key值
if(A.get(j)>nums.length/2){
return j;
}
}
return -1;
}
}
复杂度分析
时间复杂度:O(N)
空间复杂度:O(N)
执行用时: 15 ms
内存消耗: 43.8 MB
问题与不足
运行时间和占用空间都很大,只会从数据结构上优化代码,没有从算法角度思考。
其他优秀题解
摩尔投票法
震撼全家的解法,摩尔投票法
这道题是无序数组寻找众数的问题。
**pairing阶段:**两个不同选票的人进行对抗,并会同时击倒对方,当剩下的人都是同一阵营,相同选票时,结束。
**counting阶段:**计数阶段,对最后剩下的下进行选票计算统计,判断选票是否超过总票数的一半,选票是否有效。