在数组中寻找出现次数超过数组长度一半的数
春节期间小明使用微信收到很多个红包,非常开心。在查看领取红包记录时发现,某个红包金额出现的次数超过了红包总数的一半。请帮小明找到该红包金额。写出具体算法思路和代码实现,要求算法尽可能高效。
给定一个红包的金额数组gifts及它的大小n,请返回所求红包的金额。
测试样例:
[1,2,3,2,2],5
返回:2
两种思路:1.建立HashMap,用于统计每个数在数组中出现的次数。遍历数组,将结果存入HashMap中。遍历HashMap,看是否存在出现次数超过一半的数。
2.利用寻找数组中出现次数最多的数的算法得出该数,再次遍历数组看该数出现的次数是否超过数组长度的一半。
1 import java.util.*; 2 3 public class Gift { 4 public int getValue(int[] gifts, int n) { 5 if (gifts == null || gifts.length == 0) { 6 return 0; 7 } 8 if (gifts.length != n) { 9 return 0; 10 } 11 Map<Integer, Integer> map = new HashMap<>(); 12 for (int i = 0; i < n; i++) { 13 if (map.containsKey(gifts[i])) { 14 int count = map.get(gifts[i]); 15 map.put(gifts[i], count + 1); 16 } else { 17 map.put(gifts[i], 1); 18 } 19 } 20 for(Map.Entry<Integer, Integer> entry : map.entrySet()){ 21 if (entry.getValue() > n / 2) { 22 return entry.getKey(); 23 } 24 } 25 return 0; 26 } 27 } 28 29 30 . . 31 添加笔记