青训营—找出整型数组中占比超过一半的数

156 阅读1分钟

题目描述

小R从班级中抽取了一些同学,每位同学都会给出一个数字。已知在这些数字中,某个数字的出现次数超过了数字总数的一半。现在需要你帮助小R找到这个数字。

测试样例

样例1

输入:array = [1, 3, 8, 2, 3, 1, 3, 3, 3]
输出:3

样例2

输入:array = [5, 5, 5, 1, 2, 5, 5]
输出:5

样例3

输入:array = [9, 9, 9, 9, 8, 9, 8, 8]
输出:9

思路

为了找到这个数字,我们可以利用数组的排序特性。由于我们知道某个数字的出现次数超过了数组长度的一半,因此在排序后的数组中,这个数字必然会出现在中间位置。

  1. 排序数组:首先对数组进行排序。
  2. 返回中间元素:由于我们知道出现次数超过一半的数字在排序后的数组中会占据中间位置,因此我们可以直接返回排序后数组的中间元素。

Java代码

import java.util.Arrays;

public class Main {
    public static int solution(int[] array) {
        // Edit your code here
        Arrays.sort(array); // 对数组进行排序
        return array[array.length/2]; // 返回中间位置的元素
    }

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

复杂度分析

时间复杂度:排序的时间复杂度为O(nlogn),其中 n 是数组的长度。之后的中间元素访问为O(1),因此整体时间复杂度为O(nlogn)。

空间复杂度:排序算法通常需要O(n)的额外空间,具体取决于使用的排序算法。