给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋
的元素。
你可以假设数组是非空的,并且给定的数组总是存在众数。
示例 1:
输入: [3,2,3] 输出: 3
示例 2:
输入: [2,2,1,1,1,2,2] 输出: 2
解题思路一:
见到该题的第一反应是先遍历一遍,看每个元素出现的次数,利用hashMap存<元素,次数>。再遍历这个hashMap, 取出来这里面value最大的key,即是所求的众数。
这样该题的难点就是如何存入和读取hashMap了,而且,假设数组中没有众数,该方法也能去除最多次的那个。
class Solution{
public int majorityElement(int[] nums) {
Map map = new HashMap<Integer,Integer>();
int count = 0;
int res = 0;
for (int i =0;i< nums.length;i++) {
int temp = 0;
if(map.containsKey(nums[i])) {
temp = (int) map.get(nums[i]);
}
map.put(nums[i], temp+1);
}
Iterator i = map.entrySet().iterator();
while (i.hasNext()) {
Map.Entry entry = (Map.Entry) i.next();
System.out.println(entry+"--------"+ entry.getKey());
if(((int)entry.getValue())>count) {
count = (int) entry.getValue();
res = (int) entry.getKey();
}
}
return res;
}
}
解题思路二:
利用众数的定义特点,众数出现的次数大于n/2, 所以用众数和其他的元素次数相互抵消,那众数的次数依然会大于0,这就是众数的特点。
class Solution {
public int majorityElement(int[] nums) {
int count=1;//第一个元素,出现了1次
int res = nums[0];
for (int i = 1;i<nums.length;i++) {
//System.out.println(res+"---------"+nums[i]);
if(res == nums[i]) {
count++;
}else {
count--;
if(count==0) {
res = nums[i+1];
}
}
}
return res;
}
}