多数元素(多种求解)

简介: 多数元素

 问题描述

给定一个大小为 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


相关文章
|
6月前
【每日一题Day146】给定行和列的和求可行矩阵 | 贪心
【每日一题Day146】给定行和列的和求可行矩阵 | 贪心
48 0
|
6月前
|
算法 测试技术 Serverless
【二分查找】【C++算法】378. 有序矩阵中第 K 小的元素
【二分查找】【C++算法】378. 有序矩阵中第 K 小的元素
|
6月前
|
算法 测试技术 C#
【分类讨论】【解析几何】【 数学】【推荐】1330. 翻转子数组得到最大的数组值
【分类讨论】【解析几何】【 数学】【推荐】1330. 翻转子数组得到最大的数组值
|
6月前
|
算法 测试技术 C#
【动态规划】【数论】【区间合并】3041. 修改数组后最大化数组中的连续元素数目
【动态规划】【数论】【区间合并】3041. 修改数组后最大化数组中的连续元素数目
|
6月前
|
算法
|
6月前
|
存储 算法 Java
【算法训练-数组 二】【元素组合】两数之和、三数之和
【算法训练-数组 二】【元素组合】两数之和、三数之和
52 0
|
6月前
|
存储 算法 搜索推荐
【算法训练-排序算法 二】【快速排序】数组中的第K个最大元素、最小的K个数
【算法训练-排序算法 二】【快速排序】数组中的第K个最大元素、最小的K个数
65 0
|
人工智能 算法
动态规划之区间一维
噩梦中的仙境:动态规划之区间一维
67 0
动态规划之区间一维
|
存储 算法
秒懂算法 | 选第二大元素的分治算法
运用“分而治之”的思想,解决选第二大元素问题。
660 0
秒懂算法 | 选第二大元素的分治算法