掘金刷题解析:8 找出整型数组中占比超过一半的数 | 豆包MarsCode AI刷题

45 阅读3分钟

学习笔记:找出整型数组中占比超过一半的数的详细分析

问题背景 在这个问题中,我们需要找出一个数组中出现次数超过一半的数字。这个问题是一个典型的查找问题,通常被称为“多数投票问题”。

算法选择 对于这个问题,我们选择了排序和哈希计数两种方法作为解决方案。排序方法简单直观,而哈希计数方法在处理大数据集时更为高效。

算法逻辑 首先,我们需要理解问题的本质:我们需要找到一个数字,它的出现次数超过数组长度的一半。这意味着我们可以直接对数组进行排序,然后选择中间的数字,或者使用哈希表来计数每个数字的出现次数,然后找到出现次数超过一半的数字。

代码实现细节 在代码实现中,我们定义了一个函数 solution,它接受一个整数数组 array 作为参数,并返回占比超过一半的数字。函数内部,我们首先对数组进行排序,然后返回中间位置的数字。这是因为在排序后的数组中,中间位置的数字就是出现次数最多的数字,如果它出现的次数超过了数组长度的一半。

时间复杂度分析 算法的时间复杂度为 O(nlog(n)),其中 n 是数组的长度。这是因为我们需要对数组进行排序,排序的时间复杂度通常是 O(nlog(n))。

空间复杂度分析 算法的空间复杂度为 O(1),这是因为我们没有使用额外的空间来存储数据,除了输入的数组本身。

测试样例分析 我们提供了三个测试样例来验证算法的正确性: 测试样例1中,输入的 array 为 [1, 3, 8, 2, 3, 1, 3, 3, 3],输出应该是 3,意味着数字 3 出现的次数超过了数组长度的一半。 测试样例2中,输入的 array 为 [5, 5, 5, 1, 2, 5, 5],输出应该是 5,意味着数字 5 出现的次数超过了数组长度的一半。 测试样例3中,输入的 array 为 [9, 9, 9, 9, 8, 9, 8, 8],输出应该是 9,意味着数字 9 出现的次数超过了数组长度的一半。

约束条件分析 输入的 array 可能包含不同的数字,这要求我们的算法能够处理各种不同的输入。由于题目已经保证了存在一个数字的出现次数超过一半,我们的算法可以确保找到这个数字。

优化方案 虽然排序方法简单直观,但在大数据集的情况下,我们可以考虑使用哈希计数的方法来优化算法。这种方法的时间复杂度为 O(n),空间复杂度也为 O(n),但在找到第一个出现次数超过一半的数字后即可停止,这在实际应用中可能更为高效。

def solution(array):
    # 使用哈希计数的方法
    counts = {}
    for num in array:
        if num in counts:
            counts[num] += 1
        else:
            counts[num] = 1
        if counts[num] > len(array) // 2:
            return num

if __name__ == "__main__":
    # 添加测试用例
    print(solution([1, 3, 8, 2, 3, 1, 3, 3, 3]) == 3)
    print(solution([5, 5, 5, 1, 2, 5, 5]) == 5)
    print(solution([9, 9, 9, 9, 8, 9, 8, 8]) == 9)