题目指路-->找出整型数组中占比超过一半的数 - MarsCode
问题描述
小R从班级中抽取了一些同学,每位同学都会给出一个数字。已知在这些数字中,某个数字的出现次数超过了数字总数的一半。现在需要你帮助小R找到这个数字。
测试样例
样例1:
输入:
array = [1, 3, 8, 2, 3, 1, 3, 3, 3]
输出:3
通过计数,数字 3 出现了 5 次,占数组总数的5/9,超过了一半,因此返回3。
样例2:
输入:
array = [5, 5, 5, 1, 2, 5, 5]
输出:5
样例3:
输入:
array = [9, 9, 9, 9, 8, 9, 8, 8]
输出:9
解题思路
这道题的思路比较简单,只需要遍历整个数组,借助哈希表统计每个数字的出现次数,如果当前数字的出现次数超过数组长度的一半,则直接返回当前数字。
-
哈希表存储计数:
- 我们使用一个哈希表
map来存储每个数字的出现次数。哈希表的键是数字,值是该数字出现的次数。
- 我们使用一个哈希表
-
遍历数组:
-
遍历整个数组,对于每一个数字:
- 更新该数字的出现次数。
- 在每次更新时,检查这个数字的出现次数是否超过了数组长度的一半。如果超过了,直接返回该数字。
-
-
提前返回:
- 一旦找到出现次数超过一半的数字,可以立即返回,无需继续遍历其他数字。
-
时间复杂度:
- 遍历一次数组,哈希表的
get和put操作的平均时间复杂度是 O(1),所以整体的时间复杂度是 O(n),其中 n 是数组的长度。
- 遍历一次数组,哈希表的
-
空间复杂度:
- 我们使用了一个哈希表来存储每个数字的出现次数,最坏情况下,哈希表的大小可能会是数组大小,因此空间复杂度为 O(n)。
关键点:
-
map.getOrDefault(num, 0):- 这行代码检查当前数字
num在哈希表中是否已经存在。如果存在,返回它的值(即数字出现的次数);如果不存在,返回默认值 0。然后我们将该数字的出现次数加 1。
- 这行代码检查当前数字
-
if (map.get(num) > array.length / 2):- 这行代码检查当前数字的出现次数是否超过数组长度的一半。如果是,我们就返回这个数字。
-
提前返回:
- 一旦找到了符合条件的数字(出现次数超过一半),就可以立即返回该数字,避免了不必要的计算。
完整代码
import java.util.HashMap;
public class Main {
public static int solution(int[] array) {
// Edit your code here
//创建哈希表
HashMap<Integer,Integer> map=new HashMap<>();
//遍历array的元素
for(int i=0;i<array.length;i++){
int num=array[i];
//统计每个数字出现次数
map.put(num, map.getOrDefault(num,0)+1);
//如果当前元素出现次数超过一半,返回num
if(map.get(num)>array.length/2) return num;
}
return 0;
}
public static void main(String[] args) {
// Add your test cases here
System.out.println(solution(new int[]{1, 3, 8, 2, 3, 1, 3, 3, 3}) == 3);
}
}