LeetCode-算法-多数元素
程序员文章站
2022-03-15 20:32:32
...
力扣题目地址:https://leetcode-cn.com/problems/majority-element/
首先看题目:
给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例:
示例 1:
输入: [3,2,3]
输出: 3
示例 2:
输入: [2,2,1,1,1,2,2]
输出: 2
解决思路:
第一种解法:暴力**法
我的想法是首先将数组里面的元素都放入一个数据结构中,遇到重复的值就加一;思来想去感觉 Map 比较适合我的需求。将元素值作为key;循环遍历数组,如果map中没有这个key则将key存入map中,并将value设置为一,;如果存在key,则将value值加一然后存入map。
然后我们循环遍历出map中value值最大的元素,并返回。
第二种解法:数学方法
首先,我们得到的是一个无序数组,如果我们能够得到一个有序的数组,那么多数元素一定在该数组的 n/2 处有一个;假设考虑两种极限情况,首先明白初始条件多数元素大于 n/2 个,所以有序数组无论从数组中最大的还是最小的,他一定包含 n/2 这个位置。所以我们直接返回有序数组中的第 n/2 个元素即可。
代码实现:
/**
* 第一种:暴力**法 查找多数元素
* https://leetcode-cn.com/problems/majority-element/
* @param nums
* @author Geyuxuan 2020-03-13 17:50:09
* @return int
*/
public int majorityElement(int[] nums) {
//将元素放入map中
Map<Integer,Integer> numsMap = new HashMap<>(nums.length);
for (Integer item : nums){
if(numsMap.containsKey(item)){
int times = numsMap.get(item);
numsMap.put(item,++times);
}else{
numsMap.put(item,1);
}
}
//获取最大次数的元素
int maxKey = -1;
//获取最大元素的最大次数
int maxValue = 0;
for (Map.Entry<Integer,Integer> entry : numsMap.entrySet()){
//获取最大值
if(entry.getValue() > maxValue){
maxValue = entry.getValue();
maxKey = entry.getKey();
}
}
//如果数组元素最大重复数小于 多数规则,返回失败
if(maxValue <= nums.length/2){
return -1;
}
return maxKey;
}
/**
* 第二种:数学方法,如果存在多数,那么排序后,他一定在 n/2 上
* 查找多数元素
* https://leetcode-cn.com/problems/majority-element/
* @param nums
* @author Geyuxuan 2020-03-13 17:50:09
* @return int
*/
public int majorityElement1(int[] nums) {
//数组排序
Arrays.sort(nums);
//取 n/2 位置的值
return nums[nums.length/2];
}
不忘初心,砥砺前行。
上一篇: leetCode 169题 多数元素
下一篇: LeetCode算法题27:移除元素解析
推荐阅读
-
行元素从小到大递增,列元素从小到大递增的数组查找算法
-
Python cookbook(数据结构与算法)从任意长度的可迭代对象中分解元素操作示例
-
设计一个算法:用不多于3n/2的平均比较次数,在数组A[1,...,n]中找出最大值和最小值的元素
-
设计一个最优算法来查找一n个元素数组中的最大值和最小值
-
分治算法求n个元素的最大值和最小值
-
python(leetcode)-重复元素算法题
-
数据结构算法(合并区间集合元素的重叠区间)
-
Python cookbook(数据结构与算法)找出序列中出现次数最多的元素算法示例
-
Python cookbook(数据结构与算法)从序列中移除重复项且保持元素间顺序不变的方法
-
Python cookbook(数据结构与算法)找到最大或最小的N个元素实现方法示例