跳到主要内容

简述Java实现数组中出现次数超过一半的数字/ / 中位数(类似于快速排序 ) ?

参考答案:

在Java中,如果要找到一个数组中出现次数超过一半的数字,我们可以使用Boyer-Moore投票算法。这个算法可以在线性时间和常数空间复杂度下解决这个问题。

这个算法的基本思想是,由于要找的数字出现次数超过一半,那么它就可以被视为“多数派”。我们可以利用这个性质,在遍历数组的过程中,通过“消除”不同意见(即其他数字)的方式来找到这个“多数派”。

具体的算法步骤如下:

  1. 初始化一个候选众数(candidate)和一个计数器(count),都设为0。

  2. 遍历数组,对于每个元素:

    • 如果计数器为0,将当前元素设为候选众数,并将计数器设为1。
    • 如果当前元素与候选众数相同,计数器加1。
    • 如果当前元素与候选众数不同,计数器减1。
  3. 遍历结束后,候选众数就是出现次数超过一半的元素。

以下是这个算法的Java实现:

public int majorityElement(int[] nums) {
    int candidate = 0, count = 0;
    for (int num : nums) {
        if (count == 0) {
            candidate = num;
        }
        count += (num == candidate) ? 1 : -1;
    }
    return candidate;
}

值得注意的是,这个算法不仅适用于找到出现次数超过一半的数字,也适用于找到数组的中位数,因为在一个排序数组中,中位数就是出现次数超过一半的数字。

但是,如果题目要求的是在未排序的数组中找到中位数,那么我们就需要先对数组进行排序,然后再找到中间位置的数字。排序的算法有很多种,比如快速排序、归并排序、堆排序等,具体选择哪种排序算法取决于你的具体需求和数组的特性。