多数元素(多种求解)

简介: 多数元素

 问题描述

给定一个大小为 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】给定行和列的和求可行矩阵 | 贪心
46 0
|
6月前
|
算法 测试技术 C#
【动态规划】【前缀和】【和式变换】100216. K 个不相交子数组的最大能量值
【动态规划】【前缀和】【和式变换】100216. K 个不相交子数组的最大能量值
|
29天前
|
C++
数组元素移除(暴力求解)
一种原地移除数组中特定值元素的暴力求解方法,并通过C++代码示例展示了如何实现这一操作。
33 0
|
3月前
|
算法 测试技术
【算法】二分算法——寻找旋转排序数组中的最小值
【算法】二分算法——寻找旋转排序数组中的最小值
|
6月前
|
算法 测试技术 Serverless
【二分查找】【C++算法】378. 有序矩阵中第 K 小的元素
【二分查找】【C++算法】378. 有序矩阵中第 K 小的元素
|
6月前
|
算法 测试技术 C#
【动态规划】【数论】【区间合并】3041. 修改数组后最大化数组中的连续元素数目
【动态规划】【数论】【区间合并】3041. 修改数组后最大化数组中的连续元素数目
|
6月前
|
算法
|
6月前
leetcode-378:有序矩阵中第 K 小的元素
leetcode-378:有序矩阵中第 K 小的元素
36 0
|
6月前
|
算法
回溯-求出数组的所有子序列【学习算法】
回溯-求出数组的所有子序列【学习算法】
48 0
|
6月前
|
存储 算法 Java
【算法训练-数组 二】【元素组合】两数之和、三数之和
【算法训练-数组 二】【元素组合】两数之和、三数之和
52 0