算法37:多数元素

一、需求

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

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

示例 1:

输入:nums = [3,2,3]
输出:3

示例 2:

输入:nums = [2,2,1,1,1,2,2]
输出:2

示例 3:

输入:nums = [3,2,3,1,3,2,3]
输出:3

提示:

  • n == nums.length
  • 1 <= n <= 5 * 104
  • -109 <= nums[i] <= 109

进阶:

尝试设计时间复杂度为 O(n)、空间复杂度为 O(1) 的算法解决此问题。

二、思路分析图

(一)HashMap方案

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、代码

(一)数据初始化

/**
 * 入口
 *      169、多数元素
 * 输入:
 *      nums = [3,2,2,1,1,2,2]
 * 输出:
 *      result1 = 2
 *      result2 = 2
 *      result3 = 2
 * 解释:
 *      1.哈希Map方案
 *      2.投票算法
 *      3.排序算法
 */
@Test
public void suanfa37()
{
    // 初始化
    int[] nums = new int[] { 3, 2, 2, 1, 1, 2, 2 };

    // 打印
    // 哈希Map方案
    int result1 = this.majorityElementMap(nums);
    System.out.println("result1 = " + result1);

    // 投票算法
    int result2 = this.majorityElementVoting(nums);
    System.out.println("result2 = " + result2);

    // 排序算法
    int result3 = this.majorityElementSort(nums);
    System.out.println("result3 = " + result3);
}

(二)哈希Map方案

/**
 * 哈希Map方案
 *      我自己写的方案
 *      假设数组是非空的,并且给定的数组总是存在多数元素
 *      多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素
 * @param nums
 * @return
 */
public int majorityElementMap(int[] nums)
{
    Map<Integer, Integer> map = new HashMap<>();
    for (int num : nums)
    {
        if (map.containsKey(num))
        {
            Integer size = map.get(num) + 1;
            if (size > nums.length / 2)
            {
                return num;
            }
            map.put(num, size);
        }
        else
        {
            map.put(num, 1);
        }
    }
    return nums[0];
}

(三)投票算法

/**
 * 投票算法
 *      Boyer-Moore:时间复杂度为 O(n)、空间复杂度为 O(1) 
 *      多元素个数 > 非多元素个数,所以多元素个数 - 非多元素个数 > 0
 *
 * @param nums
 * @return
 */
public int majorityElementVoting(int[] nums)
{
    int count = 0;
    Integer candidate = null;

    for (int num : nums)
    {
        if (count == 0)
        {
            candidate = num;
        }
        count += (num == candidate) ? 1 : -1;
    }

    return candidate;
}

(四)排序算法

/**
 * 排序算法
 *
 * @param nums
 * @return
 */
public int majorityElementSort(int[] nums)
{
    Arrays.sort(nums);
    return nums[nums.length / 2];
}

(五)结果图

在这里插入图片描述

作者:王子威

四、总结

  • 学习了多数元素算法
  • HashMap直接就做出来了
  • 排序有想到但没有做出实践
  • 投票算法没有想到这样,只是想到异或,虽然有点像但并不是
  • 算法兴趣+1 总:37
  • 加强了对算法的分析能力
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值