这道题我首先用的是哈希表用来记录元素,具体思路就不展示了
public int majorityElement(int[] nums) {
int a = nums.length;
Map<Integer,Integer> map = new HashMap<>();
for (int i = 0;i<a;i++){
int x = nums[i];
Integer integer = map.get(x);
if (integer == null){
map.put(x,1);
}else{
integer++;
map.put(x,integer);
if (integer>a/2){
return x;
}
}
}
return -1;
}
再一次我看官方的解法,看到了一个思路,俗称:摩尔投票法
- 将第一个元素设为标志初始值,标志数量设为1
- 遍历元素,当元素与标志值不同时标志值--,相同时++
- 当标志值--时,判断标志值是否=0,等于零更换标志为nums[i],数量置1.
- 最后返回的标志即大于n/2的数
public int majorityElement(int[] nums) {
//摩尔投票法:
int a = 0;
Integer b = null;
for (int x : nums) {
if (a == 0)
b = x;
a += (x == b) ? 1 : -1;
}
return b;
}