题目来源: JZ39 数组中出现次数超过一半的数字
题目描述:
- 描述: 给一个长度为 n 的数组,数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
数据范围: n≤50000,数组中元素的值0≤val≤10000
要求: 空间复杂度O(1),时间复杂度O(n)
- 比如:例如输入一个长度为9的数组[1,2,3,2,2,2,5,4,2]。
- 由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。
- 比如:例如输入一个长度为9的数组[1,2,3,2,2,2,5,4,2]。
- 输入描述: 保证数组输入非空,且保证有解
示例1:
输入:[1,2,3,2,2,2,5,4,2]
返回值:2
示例2:
输入:[3,3,3,3,2,2,2]
输出:3
示例3:
输入:[1]
输出:1
思路
- 知识点:哈希表 思路:
- 哈希表可以根据key直接访问对应的value,而时间复杂度是需要O(1)
- 数组某个元素出现次数超过了数组长度的一半,那它肯定出现最多,而且只要超过了一半,其他数字不可能超过一半了,必定是它。
- 使用哈希表,直接将数组进行遍历,其中key值对应数组的元素,而value则存放该数组元素出现的次数
- 具体做法:
- 1.构建一个哈希表进行辅助操作,对数组中的元素出现的次数进行统计
- 2.对数组进行遍历,如果数组元素不在哈希表中,则存入哈希表,对应的value+1,如果哈希表中有该元素,则对应的value+1
- 3.根据前面的思考,发现如果某元素在数组中的个数超过一半,那么它的value的值最终一定会超过一半,所以我们每次给value进行+1操作后,需要检测一下value的大小是否超过数组的一半
- 图示:
具体实现:
import java.util.*;
public class Solution {
public int MoreThanHalfNum_Solution(int [] array) {
//哈希表统计每个数字出现的次数
HashMap<Integer, Integer> mp = new HashMap<Integer, Integer>();
//遍历数组
for(int i = 0; i < array.length; i++){
//统计频率
if(!mp.containsKey(array[i]))
mp.put(array[i], 1);
else
mp.put(array[i], mp.get(array[i]) + 1);
//一旦有个数大于长度一半的情况即可返回
if(mp.get(array[i]) > array.length / 2)
return array[i];
}
return 0;
}
}
开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 7 天,点击查看活动详情”