找出整型数组中占比超过一半的数| 豆包MarsCode AI刷题

43 阅读3分钟

题目指路-->找出整型数组中占比超过一半的数 - 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 来存储每个数字的出现次数。哈希表的键是数字,值是该数字出现的次数。
  • 遍历数组

    • 遍历整个数组,对于每一个数字:

      • 更新该数字的出现次数。
      • 在每次更新时,检查这个数字的出现次数是否超过了数组长度的一半。如果超过了,直接返回该数字。
  • 提前返回

    • 一旦找到出现次数超过一半的数字,可以立即返回,无需继续遍历其他数字。
  • 时间复杂度

    • 遍历一次数组,哈希表的 getput 操作的平均时间复杂度是 O(1),所以整体的时间复杂度是 O(n),其中 n 是数组的长度。
  • 空间复杂度

    • 我们使用了一个哈希表来存储每个数字的出现次数,最坏情况下,哈希表的大小可能会是数组大小,因此空间复杂度为 O(n)。

关键点:

  1. map.getOrDefault(num, 0)

    • 这行代码检查当前数字 num 在哈希表中是否已经存在。如果存在,返回它的值(即数字出现的次数);如果不存在,返回默认值 0。然后我们将该数字的出现次数加 1。
  2. if (map.get(num) > array.length / 2)

    • 这行代码检查当前数字的出现次数是否超过数组长度的一半。如果是,我们就返回这个数字。
  3. 提前返回

    • 一旦找到了符合条件的数字(出现次数超过一半),就可以立即返回该数字,避免了不必要的计算。

完整代码

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);
    }
}