找出整形数组中占比超过一半的数

64 阅读5分钟

问题描述

小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

Java

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

9

10

11

7

8

5

6

2

3

4

1

            if (count == 0) {

                candidate = num;

            }

            // 根据当前元素更新计数

            if (num == candidate) {

                count++;

            } else {

                count--;

            }

        }

        // 返回候选元素

        return candidate;

    }

    public static void main(String[] args) {

        // 遍历数组

        for (int num : array) {

            // 如果计数为0,更新候选元素

        int count = 0;

        // 初始化候选元素和计数

        int candidate = 0;

public class Main {

    public static int solution(int[] array) {

MarsCode AI

MarsCode AI

好的,我来帮你检查一下编辑区的代码。

代码检查

java

public class Main {

    public static int 

    solution(int[] array) 

    {

        // 初始化候选元素和计

        数

        int candidate = 0;

        int count = 0;

        // 遍历数组

        for (int num : 

        array) {

            // 如果计数为0,

            更新候选元素

            if (count == 

            0) {

                candidate 

                = num;

            }

            // 根据当前元素

            更新计数

            if (num == 

            candidate) {

                count++;

            } else {

                count--;

            }

        }

        // 返回候选元素

        return candidate;

    }

    public static void 

    main(String[] args) {

        // 测试用例

        System.out.println

        (solution(new int

        []{1, 3, 8, 2, 3, 

        1, 3, 3, 3}) == 

        3);

    }

}

检查结果

  1. 代码逻辑

    • 代码使用了摩尔投票算法(Boyer-Moore Voting Algorithm)来找到出现次数超过数组长度一半的元素。
    • 逻辑上是正确的,能够正确找到出现次数超过一半的元素。
  2. 代码风格

    • 代码风格良好,注释清晰,变量命名合理。
  3. 测试用例

    • 测试用例 System.out.println(solution(new int[]{1, 3, 8, 2, 3, 1, 3, 3, 3}) == 3); 是正确的,能够验证代码的正确性。

结论

你的代码逻辑正确,风格良好,测试用例也正确。代码没有问题,可以正常运行并得到正确的结果。

如果你有其他问题或需要进一步的帮助,请随时告诉我!

摩尔投票算法的时间复杂度是多少?

需要一点思路提示

给我一些代码提是 给我一些代码提示

好的,我可以给你一些代码提示来帮助你解决这个问题。我们可以使用摩尔投票算法(Boyer-Moore Voting Algorithm)来高效地找到出现次数超过数组长度一半的元素。这个算法的时间复杂度是O(n),空间复杂度是O(1)。

解题思路

  1. 初始化:我们需要两个变量,一个用于存储当前候选元素(candidate),另一个用于存储当前候选元素的计数(count)。
  2. 遍历数组:对于数组中的每个元素:
    • 如果count为0,将当前元素设为候选元素,并将count设为1。
    • 如果当前元素等于候选元素,增加count
    • 如果当前元素不等于候选元素,减少count
  3. 验证:遍历结束后,候选元素就是出现次数超过数组长度一半的元素。

代码提示

你可以根据上述思路,在solution方法中实现摩尔投票算法。以下是一些代码提示:

public class Main {
    public static int solution(int[] array) {
        // 初始化候选元素和计数
        int candidate = 0;
        int count = 0;

        // 遍历数组
        for (int num : array) {
            // 如果计数为0,更新候选元素
            if (count == 0) {
                candidate = num;
            }

            // 根据当前元素更新计数
            if (num == candidate) {
                count++;
            } else {
                count--;
            }
        }

        // 返回候选元素
        return candidate;
    }

    public static void main(String[] args) {
        // 测试用例
        System.out.println(solution(new int[]{1, 3, 8, 2, 3, 1, 3, 3, 3}) == 3);
    }
}

关键步骤

  • 初始化candidatecount
  • 遍历数组:根据当前元素更新candidatecount
  • 返回结果:遍历结束后,candidate即为所求元素。

你可以根据这些提示继续完善你的代码。如果有任何问题,欢迎继续提问!

帮我检查一下编辑区的代码

好的,我来帮你检查一下编辑区的代码。

代码检查

public class Main {
    public static int solution(int[] array) {
        // 初始化候选元素和计数
        int candidate = 0;
        int count = 0;

        // 遍历数组
        for (int num : array) {
            // 如果计数为0,更新候选元素
            if (count == 0) {
                candidate = num;
            }

            // 根据当前元素更新计数
            if (num == candidate) {
                count++;
            } else {
                count--;
            }
        }

        // 返回候选元素
        return candidate;
    }

    public static void main(String[] args) {
        // 测试用例
        System.out.println(solution(new int[]{1, 3, 8, 2, 3, 1, 3, 3, 3}) == 3);
    }
}

检查结果

  1. 代码逻辑

    • 代码使用了摩尔投票算法(Boyer-Moore Voting Algorithm)来找到出现次数超过数组长度一半的元素。
    • 逻辑上是正确的,能够正确找到出现次数超过一半的元素。
  2. 代码风格

    • 代码风格良好,注释清晰,变量命名合理。
  3. 测试用例

    • 测试用例 System.out.println(solution(new int[]{1, 3, 8, 2, 3, 1, 3, 3, 3}) == 3); 是正确的,能够验证代码的正确性。

结论

你的代码逻辑正确,风格良好,测试用例也正确。代码没有问题,可以正常运行并得到正确的结果。

如果你有其他问题或需要进一步的帮助,请随时告诉我!

摩尔投票算法的时间复杂度是多少?

摩尔投票算法(Boyer-Moore Voting Algorithm)的时间复杂度是 O(n),其中 n 是数组的长度。

解释

  • 遍历数组:算法只需要遍历数组一次,因此时间复杂度是线性的,即 O(n)。
  • 空间复杂度:算法的空间复杂度是 O(1),因为它只使用了常数个额外的变量(candidatecount)。

这种算法非常适合解决“多数元素”问题,因为它在时间和空间上都非常高效。