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

53 阅读3分钟

问题描述

小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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

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

            }

        }

        // 验证候选元素是否确实是多数元素

        count = 0;

        for (int num : array) {

            if (num == candidate) {

                count++;

            }

        }

        // 如果候选元素的出现次数超过数组长度的一半,返回候选元素

        if (count > array.length / 2) {

MarsCode AI

MarsCode AI

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

以下是一些代码提示:

  1. 初始化变量

    • 你需要一个变量来存储当前候选元素(即可能的多数元素)。
    • 你还需要一个计数器来记录当前候选元素的票数。
  2. 遍历数组

    • 遍历数组中的每一个元素。
    • 如果计数器为0,将当前元素设为候选元素,并将计数器设为1。
    • 如果当前元素与候选元素相同,增加计数器。
    • 如果当前元素与候选元素不同,减少计数器。
  3. 验证结果

    • 遍历结束后,候选元素就是可能的多数元素。
    • 你可以再次遍历数组,验证这个元素的出现次数是否确实超过数组长度的一半。

以下是代码框架:

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

            }

        }

        // 验证候选元素是否确

        实是多数元素

        count = 0;

        for (int num : 

        array) {

            if (num == 

            candidate) {

                count++;

            }

        }

        // 如果候选元素的出现

        次数超过数组长度的一

        半,返回候选元素

        if (count > array.

        length / 2) {

            return 

            candidate;

        } else {

            // 这里可以根据

            题目要求处理异常

            情况

            throw new 

            IllegalArgumen

            tException

            ("No majority 

            element 

            found");

        }

    }

    public static void 

    main(String[] args) {

        // 测试用例

        System.out.println

        (solution(new int

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

        1, 3, 3, 3}) == 

        3);

    }

}

你可以根据这个框架继续完善你的代码。如果你有任何问题或需要进一步的帮助,请告诉我!

摩尔投票算法是什么?

给我一些代码提示

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