多数元素(多种求解)

简介: 多数元素

 问题描述

给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。

你可以假设数组是非空的,并且给定的数组总是存在多数元素。

示例1:

输入:[3,2,3]

输出:3

示例2:

输入:[2,2,1,1,1,2,2]

输出:2

解法一:暴力求解法

每次取数组中的一个数,通过计数来判断这个数的个数是否大于n/2。

代码实现:

public static int majorityElement1(int[] arr){
        for (int i = 0; i < arr.length/2+1; i++) {
            int temp = 1;
            for (int j = i+1; j < arr.length; j++) {
                if (arr[i] == arr[j]){
                    temp++;
                }
            }
            if (temp > arr.length/2){
                return arr[i];
            }
        }
        return -1;
    }

image.gif

解法二:排序取中法

通过思考,我们发现只要将数组排序,那么元素个数大于n/2的元素一定处于中间位置。

代码实现:

public static int majorityElement2(int[] arr){
        Arrays.sort(arr);
        return arr[arr.length/2];
    }

image.gif

这个方法需要思考,但是想到了以后代码实现特别简单。

解法三:摩尔投票法

这个思想方法来源于现实生活,比如生活中选班长。

将第一个数作为标记,计数为一,从第二个元素开始,若这个元素与标记为元素相同,则计数加一,否则减一,当计数为零时,更换当前位置元素未标记位下面我们来做个示例:

image.gif编辑

image.gif编辑

代码实现:

public static int majorityElement3(int[] arr){
        int candidate = arr[0];
        int count = 1;
        for (int i = 1; i < arr.length; i++) {
            if (arr[i] == candidate){
                count++;
            }else {
                count--;
                if (count == 0){
                    candidate = arr[i];
                    count = 1;
                }
            }
        }
        return candidate;
    }

image.gif


目录
打赏
0
0
1
0
15
分享
相关文章
|
10月前
|
动态规划矩阵
动态规划矩阵
67 0
【算法训练-数组 二】【元素组合】两数之和、三数之和
【算法训练-数组 二】【元素组合】两数之和、三数之和
103 0
C语言计算N*N矩阵的转置、平均值、对角线元素之和、周边元素之和
C语言计算N*N矩阵的转置、平均值、对角线元素之和、周边元素之和
319 0
求解子序列
求解子序列
75 0
R7-5 求矩阵各行元素之和
R7-5 求矩阵各行元素之和
124 0
秒懂算法 | 选第二大元素的分治算法
运用“分而治之”的思想,解决选第二大元素问题。
718 0
秒懂算法 | 选第二大元素的分治算法