LeetCode 169.多数元素

【简单】力扣算法题解析LeetCode169:多数元素 本文介绍了一种高效求解多数元素问题的算法——摩尔投票法。该算法通过抵消不同元素来找到出现次数超过数组长度一半的元素,时间复杂度为O(n),空间复杂度为O(1)。文章详细解释了算法的核心思想、正确性证明,并提供了Java代码实现。算法首先初始化候选元素和计数器,遍历数组时通过比较和抵消操作更新候选元素,最终剩余的候选即为多数元素。该方法适用于大规模数据,满足进阶要求。 阅读详情
169.多数元素

在这里插入图片描述

思路一:

适用哈希映射(HashMap)来实现,key表示数组的元素,value表示各元素出现的次数,然后找到出现次数最大的一个或者,找到第一次超过n/2次的元素。

class Solution {
    public int majorityElement(int[] nums) {
        int mid = nums.length / 2;
        Map<Integer, Integer> count = new HashMap<>();
        for (int num : nums) {
            if (count.containsKey(num)) {
                if (count.get(num) + 1 > mid) {
                    return num;
                } else {
                    count.put(num, count.get(num) + 1);
                }
            } else {
                count.put(num, 1);
            }
        }
        for (int num : count.keySet()) {
            return num;
        }
        return 0;
    }
}
思路二:

因为考虑到多数元素的定义是出现次数超过n/2次的元素,那么考虑排序后取n/2下标的值就是多数元素;

假如长度为奇数的数组(例如7),出现次数大于n/2(例如3.5,即最少出现4次)的元素,那么排序后位于中间位置(4)元素肯定是属于那个最多的。

假如长度为偶数的数组(例如6),出现次数大于n/2(例如3,即最少出现4次)的元素,那么排序后位于第3、4都应该是最大的,所以取第3、4都可以。

class Solution {
    public int majorityElement(int[] nums) {
        Arrays.sort(nums);
        return nums[nums.length/2];
    }
}

适用java的排序,使用的是双轴快速排序;

考虑到我们取的是中间位置的数,那么可以采用快速排序,然后根据每次分割后的下标

若下标刚好是中间位置,那么就是这个数为众数;

后面的排序只需要排中间位置存在的的那一个分组

这样就不用全部排序;

class Solution {
    public int majorityElement(int[] nums) {
        return quickSort(nums, 0, nums.length - 1, nums.length / 2);
    }
    private int quickSort(int[] nums, int low, int high, int mid) {
        int index = getIndex(nums, low, high);
        if (index == mid) {
            return nums[mid];
        }
        if (index > mid) {
            return quickSort(nums, low, index - 1, mid);
        } else {
            return quickSort(nums, index + 1, high, mid);
        }
    }

    private int getIndex(int[] nums, int low, int high) {
        int temp = nums[low];
        int i = low;
        int j = high;
        while (i != j) {
            while (nums[j] >= temp && i < j)
                j--;
            //再找右边的
            while (nums[i] <= temp && i < j)
                i++;
            //交换两个数在数组中的位置
            if (i < j) {
                int t = nums[i];
                nums[i] = nums[j];
                nums[j] = t;
            }
        }
        //最终将基准数归位
        nums[low] = nums[i];
        nums[i] = temp;
        return i;
    }
}
思路三:

在解题思路中找到的方法—Boyer-Moore 算法:

  • Boyer-Moore 算法
    • 维护一个候选众数 candidate 和它出现的次数 count。初始时 candidate 可以为任意值,count 为 0;
    • 遍历数组中的所有元素,对于每个元素 x
      • 在判断 x 之前,如果 count 的值为 0,我们先将 x 的值赋予 candidate,随后我们判断 x:
      • 如果 x 与 candidate 相等,那么计数器 count 的值增加 1;
      • 如果 x 与 candidate 不等,那么计数器 count 的值减少 1。
    • 在遍历完成后,candidate 即为整个数组的众数。
class Solution {
    public int majorityElement(int[] nums) {
        int count = 0;
        Integer candidate = null;
        for (int num : nums) {
            if (count == 0) {
                candidate = num;
            }
            count += (num == candidate) ? 1 : -1;
        }
        return candidate;
    }
}

在这里插入图片描述

14、利用Helm和GitOps实现Kubernetes资源管理与CI/CD流程优化 本文介绍了如何结合Helm、GitOps和Terraform等工具,优化Kubernetes资源管理和CI/CD流程。内容涵盖了Helm提供程序的配置、GitOps的核心理念、CI/CD管道的构建与测试策略、GitHub源代码管理模型以及流程优化建议,旨在提升软件开发和部署的效率与质量。 阅读详情

相关推荐

h5支付不能打开支付宝 ios_iOS支付宝H5支付无法返回APP解决方案

本文前大段在讲楼主是如何解决这个问题的,以及中间遇到的麻烦。赶时间的同学可以直接看最后的 最终解决方案。在讨论之前,我们先看看官方文档上的一句话:注意:在iOS系统中,唤起支付宝App支付完成后,不会自动回到浏览器或商户APP。用户可手工切回到浏览器或商户APP;支付宝H5收银台会自动跳转回商户return_url指定的页面。what? 官方直接跟我们说GG了?楼主不甘心,还是想尝试一下。借鉴之前...

weixin_39864101的博客 856

【LeetCode】169.多数元素(三种解法)

问题描述 这是LeetCode上的一道算法题,博主整理了三种解题思路和方法,希望可以帮助大家提升算法的思维。 给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1: 输入:[3,2,3] 输出:3 示例 2: 输入:[2,2,1,1,1,2,2] 输出:2 进阶: 尝试设计时间复杂度为 O(n)、空间复杂度为 O(1) 的算法解决此问题。 来源:力扣(LeetCode) 链接:169

VIBE的博客 4668

ESP32开发环境避坑指南:用Thonny烧录MicroPython固件时常见的5个错误及解决方法

本文针对ESP32开发新手,详细解析了使用Thonny IDE烧录MicroPython固件时最常见的5个错误及其解决方案。内容涵盖驱动安装、端口识别、固件烧录失败、版本兼容性、连接不稳定以及文件系统操作异常等核心痛点,并提供硬件层面的深度排查指南,帮助开发者高效搭建稳定的ESP32开发环境。

weixin_29189003的博客 411

leetcode第169题

leetcode第169题:多数元素 给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 方法一:排序法 因为多数元素的是出现次数大于n/2的元素,所以中间那个元素一定是多数元素 时间复杂度O(nlgn),空间复杂度O(1) class Solution { public: int majorityElement(vector<int>& nums) {

timoraty的博客 515

手动测试台架搭建,让你的车载测试更轻松

如果你也在经常进行车载测试,就知道有时候手头的设备并不能完全满足需求。 在我之前的测试中,发现了一些问题,但是却找不到根本原因。于是,我开始思考如何打造一个更为完美的手动测试台架,让测试变得更加轻松。 经过不断地实践和调试,我终于成功搭建出了一个能够满足自己需求的测试台架。现在,我想和大家分享这个搭建的经验,希望能够帮助到在车载测试领域工作的小伙伴们,让你们的测试更加准确、高效!

weixin_67553250的博客 1万+

VsCode+JLink+GCC替代Keil开发GD32程序-个人总结

对个人使用vscode+Jlink开发GD32程序做了总结,供需要者参考。

MyCollege1999的博客 2769

LeetCode第169题_多数元素

给定一个大小为 n 的数组nums,返回其中的多数元素。多数元素是指在数组中出现次数⌊ n/2 ⌋的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。

qq_40263592的博客 1011

改进爬山算法之六:随机重启爬山算法(Random-Restart Hill Climbing,RRHC)

随机重启爬山算法(Random-Restart Hill Climbing,RRHC)是爬山算法的一种改进策略,是一种启发式搜索算法,旨在通过随机重启来克服传统爬山算法容易陷入局部最优解的局限性,并增加找到全局最优解的概率。随机重启爬山算法通过在多次运行中不断尝试不同的初始解,并在每次运行中执行标准的爬山算法,最终选择所有运行中找到的最佳解作为最终结果。(1)计算复杂度:由于需要多次运行爬山算法,因此算法的计算复杂度可能较高,特别是在解空间较大或每次迭代需要较长时间的情况下。

搏博的专栏 2207

LeetCode-169. 多数元素【计数,哈希表,排序,随机化,分治】

count=1;return ans;时间复杂度为 O(n)空间复杂度为 O(1)public:时间复杂度为 O(n)空间复杂度为 O(n)

zik的博客 888

vue2 - 实现移动端H5网页调用手机相册选取图片或打开摄像头相机拍照上传,如何在h5网站浏览器中打开本机相册或相机选择相片,H5调用本地相册/相机上传图片详细教程(附图片压缩功能及上传服务器示例)

vue2手机H5网页,调起安卓苹果ios手机相册和相机,H5实现调用手机摄像头相册实现图片压缩预览删除,vue项目调用摄像头和相册,H5调用手机摄像头,实时拍照上传,VUE2 H5页面如何唤起手机摄像头拍照上传,H5调起手机端的摄像头,html5调用手机摄像头,实现H5调起手机相机和相册,vue H5拍照上传,手机网站浏览器移动端调取相机或相册,实现拍照上传功能,解决苹果ios手机无法打开相册相机问题,无法唤起摄像头怎么办,调取本机系统的相册,vue h5网页调用相机拍照和相册,实现多张图片上传功能,图片压

✅ 精选推荐文章 1万+

信号与电源完整性5:轨道塌陷噪声/电源轨道噪声分析及降低解决方案

经过上一节关于串扰的分析,我们已经清楚,噪声问题不仅仅来源于信号网络;电源和地网络所产生的噪声,被反馈到其所在的元器件和信号网络时,其破坏力也是巨大的;本节所讨论的轨道塌陷噪声就是一个典型的实例。在经过电源的地网络的电流发生改变时,在电源和地之间的阻抗上将产生一个压降;由于该压降的产生,用电元件的电压将直接被拉低,甚至可能对电路产生功能性的错误。接下来硬小二将详细的分析电源轨道噪声和降低其的解决方法。...

fydar的博客 2245

Leetcode169.多数元素(4种解法)

给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于⌊ n/2 ⌋的元素。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/majority-element 法1:取巧 由于题目条件说明给定的数组总是存在多数元素,因此排序之后,打印nums[nums.length/2]位置的元素必定是多数元素 执行用时:2ms,在所有Java提交中击败了62.65%...

AC君の 博客 543

全志T527-TP9930-Camera

TP9930 驱动模块主要实现将 4 路的 AHD/TVI/CVBS Camera 的数据转换为 BT656/BT1120 数据,从而实现在 T527 端来对数据进行处理和送显。

Linux驱动开发工程师,熟悉Linux/Android底层驱动、TP、显示、IIC、网络等通用外设调试适配,Linux上层应用开发。常用平台瑞芯微、全志、恩智浦等。 3245

[力扣LeetCode]169-多数元素

[力扣LeetCode]169-多数元素

JoeyTanHDU的博客 999

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

力扣 leetcode 169. 多数元素

力扣 leetcode 169. 多数元素 题目 给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1: 输入: [3,2,3] 输出: 3 示例 2: 输入: [2,2,1,1,1,2,2] 输出: 2 来源:力扣(LeetCode) 1.我的解法 先上代码 class Solution { public int majorityElement(int[] nums) {

努力努力再努力的博客 330

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

力扣简单题系列:多数元素(LeetCode 169)

这道题通过摩尔投票法,高效地找到了数组中的多数元素。对于初学者来说,掌握摩尔投票法的思想是解决类似问题的关键。

weixin_53910667的博客 1688

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

LeetCode力扣 第169题:多数元素(哈希表)

本文讲解了力扣第169题《多数元素》的解法。题目要求在给定数组中找到出现次数超过半数的元素。文章通过哈希表的方法给出解决方案:先统计每个元素的出现次数,再遍历哈希表找到满足条件的元素。代码示例展示了具体实现,并分析了时间复杂度和空间复杂度均为O(n)。该方法适合刚学习哈希表的同学练习,文章最后还推荐了相关学习资源。

我是一个小学生,上6年级了 1031

Leetcode 169. 多数元素

Leetcode 169. 多数元素1、问题分析2、问题解决3、总结 1、问题分析 题目链接:https://leetcode-cn.com/problems/majority-element/   本质上就是一个先排序后遍历问题。代码我已经进行了详细的注释,理解应该没有问题,读者可以作为参考,如果看不懂(可以多看几遍),欢迎留言哦!我看到会解答一下。 2、问题解决   笔者以C++方式解决。 #include "iostream" using namespace std; #include "algo

珍惜 8779

leetcode 169. 多数元素

设数组长度为n,多数元素为target,出现次数为m,则m > n/2。其他元素统称为non-target,总出现次数为k = n - m,则k < m(因为。

weixin_45524582的博客 1287

力扣169. 多数元素(哈希)

力扣169. 多数元素(哈希) https://leetcode-cn.com/problems/majority-element/ 给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于⌊ n/2 ⌋的元素。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例1: 输入: [3,2,3] 输出: 3 示例2: 输入: [2,2,1,1,1...

小麦China的博客 281

【LeetCode】—169.多数元素

✏️ 关于专栏:专栏用于记录中做题与总结。

Wneosy的博客 771

《LeetCode力扣练习》第169题 多数元素 Java

《LeetCode力扣练习》第169题 多数元素 Java 一、资源 题目: 给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1: 输入:[3,2,3] 输出:3 示例 2: 输入:[2,2,1,1,1,2,2] 输出:2 进阶: 尝试设计时间复杂度为 O(n)、空间复杂度为 O(1) 的算法解决此问题。 来源:力扣(LeetCode) 链接:https://leetcod

XRT_knives的博客 314

力扣解题-169. 多数元素

哈希表法(第一种):逻辑通用但效率低,空间O(n),适合不了解题目特性的通用场景;排序计数法(第二种):逻辑冗余,排序+复杂计数导致性能差,无实际使用价值;排序取中法(第三种):利用多数元素的位置特性简化逻辑,时间O(nlogn),是“次优解”;摩尔投票法(示例解答):本题最优解,时间O(n)、空间O(1),核心是利用“多数元素票数抵消不完”的特性,无需统计具体次数即可找到结果。核心技巧:面对“多数元素>n/2”的问题,优先考虑摩尔投票法,而非通用的哈希/排序思路。

qq_38261626的博客 978

力扣—169.多数元素

给定一个大小为n的数组nums,返回其中的多数元素。多数元素是指在数组中出现次数⌊ n/2 ⌋的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。

lllay_的博客 720

Leetcode169. 多数元素

Leetcode169. 多数元素 题目: 给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊n/2⌋⌊ n/2 ⌋⌊n/2⌋ 的元素。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 题解: 方案一:hash表方式,额外定义一个hashmap,key为每个元素值,value为每个元素的个数,找到最大的value对应的key即可。 时间复杂度:O(n)...

会流泪de鱼的博客 516

LeetCode 169 多数元素

LeetCode 169 多数元素题目:给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。方法一、HashMap词频统计:方法二、投票法: 题目:给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。 [https://leetcode-cn.com/problems/majority-el...

weixin_43703117的博客 349
上一篇: LeetCode 136.只出现一次的数字
下一篇: LeetCode 289.生命游戏
wxianyou
博客等级 码龄9年 1粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值