Day16:数组中出现次数超过一半的数字
仓库管理员以数组 stock
形式记录商品库存表。stock[i]
表示商品 id
,可能存在重复。请返回库存表中数量大于 stock.length / 2
的商品 id
。
示例 1:
输入:stock = [6, 1, 3, 1, 1, 1] 输出:1
LCR 158. 库存管理 II - 力扣(LeetCode)
用一个桶,遍历数组,出现一次就++,大于1/2说明只可能有一个数字,每次++的时候检查一下是否超了,如果超了,直接return就行。
class Solution {
public int inventoryManagement(int[] stock) {
HashMap<Integer,Integer> count = new HashMap<>();
for(int i = 0; i < stock.length; i++){
count.put(stock[i],count.getOrDefault(stock[i],0) + 1);
}
// 找到频率超过一半的元素
for (int i = 0; i < stock.length; i++) {
if (count.get(stock[i]) > stock.length / 2) {
return stock[i];
}
}
return 0;
}
}
还有一种效率更高的方法:摩尔投票法
class Solution {
public int inventoryManagement(int[] stock) {
int x = 0, votes = 0, count = 0;
for(int num : stock){
if(votes == 0) x = num;
votes += num == x ? 1 : -1;
}
// 验证 x 是否为众数
for(int num : stock)
if(num == x) count++;
return count > stock.length / 2 ? x : 0; // 当无众数时返回 0
}
}