* 题目内容: * 给定一个大小为 n 的数组,找到其中的多数元素。 * 多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 * 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 * 示例 1: * 输入:[3,2,3] -> [2,3,3] * 输出:3 * 示例 2: * 输入:[2,2,1,1,1,2,2] -> [1,1,1,2,2,2,2] * 输出:2
题目分析:
1,在数组中找多数元素就是找众数,一般当数组元素排序后
众数是中间的元素
2,或者使用哈希表方法,映射存储出现的元素和该元素出现的次数
代码如下:
(1)一般方法
import java.util.Arrays; public class Test{ public static void main(String[] args) { int[] arr =new int[]{2,2,1,1,1,2,2}; System.out.println( "这个数组的众数是:" + manyNum(arr)); } public static int manyNum(int[] arr){ //JDK已有排序方法 Arrays.sort(arr); return (arr[arr.length /2]); } }
(2)哈希表方法
步骤;
1.产生对象
HashMap<Inteder,Integer> map = new HashMap<>();
2.设置内容
key 值唯一,不能重复,value可重复
map.put(key,value);
3.取得内容,取得key值对应的value
map.get(key);
4.遍历
Set<Map.Entry<Integer,Integer>> set = map.entrySet(); for(Map.Entry<Integer,Integer>entry:set){}
代码如下:
public static int manyNum(int[] arr) { HashMap<Integer, Integer> map = new HastMap<>(); //遍历数组将不重复元素以及出现次数存在映射中 for (int i = 0; i < arr.length; i++) { //此时映射存在元素 if (map.containsKey(arr[i])) { //将出现次数+1 int value = map.get(arr[i]); map.put(arr[i], value + 1); } else { //此时映射还没有该元素 map.put(arr[i], 1);//HashMap表中存储方法put(不重复的元素,value) } } //在数据集查找出现次数> n/2的元素 //哈希表的遍历 Set<Map.Entry<Integer, Integer>> set = map.entrySet(); for (Map.Entry<Integer, Integer> entry : set) { //取出每个元素的value值 if (entry.getVlaue() > arr.length / 2) { return entry.getKey(); } } return -1; }