剑指 Offer 39. 数组中出现次数超过一半的数字
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例 1:
输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]
输出: 2
首先这道题我就想到了排序和map两个方法,但是排序时间复杂度高,我就使用了map解法,以下是代码 ,但是时间复杂度和空间复杂度仍然不低
public int majorityElement(int[] nums) {
int len = nums.length/2;
System.out.println(len);
Map<Integer,Integer> map = new HashMap<Integer,Integer>();
for(int i = 0;i < nums.length;i++){
Integer temp = map.get(nums[i]);
if(temp == null) {
map.put(nums[i], 1);
}else {
map.put(nums[i], temp + 1);
}
}
int count = 0;
for (Entry<Integer,Integer> a : map.entrySet()) {// 节点的key和value进行遍历 返回一个set集合
if(a.getValue() > len) {
count = a.getKey();
}
}
return count;
}
于是我又找到了一个叫摩尔投票的算法 非常简单 放代码
public int majorityElement(int[] nums) {
int x = 0, votes = 0;
for(int num : nums){
if(votes == 0) x = num;
votes += num == x ? 1 : -1;
}
return x;
}
本文探讨了一种高效算法,用于从数组中找到出现次数超过一半的数字,即多数元素。介绍了传统的排序和map方法,但重点讲解了摩尔投票算法,这是一种时间和空间复杂度更低的解决方案。
804

被折叠的 条评论
为什么被折叠?



