代码训练LeetCode(18)多数元素

embedded/2024/9/22 21:11:28/

代码训练(18)LeetCode之多数元素

Author: Once Day Date: 2024年9月13日

漫漫长路,才刚刚开始…

全系列文章可参考专栏: 十年代码训练_Once-Day的博客-CSDN博客

参考文章:

  • 169. 多数元素 - 力扣(LeetCode)
  • 力扣 (LeetCode) 全球极客挚爱的技术成长平台

文章目录

      • 代码训练(18)LeetCode之多数元素
        • 1. 原题
        • 2. 分析
        • 3. 代码实现
        • 4. 总结

1. 原题

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

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

提示:

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

示例 1:

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

示例 2:

输入:nums = [2,2,1,1,1,2,2]
输出:2
2. 分析

本题目要求找出一个数组中的多数元素,即出现次数大于数组长度一半的元素。题目保证了这样的元素总是存在。

常见解题方法:

  • 哈希表法:使用哈希表记录每个元素的出现次数,然后遍历哈希表找到出现次数大于 n/2 的元素。这种方法的时间复杂度是 O(n),但空间复杂度也是 O(n)。
  • 排序法:将数组排序,中间的元素(索引为 n/2)必为多数元素。时间复杂度是 O(nlogn),因为排序的平均时间复杂度为 O(nlogn),空间复杂度取决于排序实现,通常为 O(1) 到 O(n)。
  • 摩尔投票法(Boyer-Moore Voting Algorithm):这是一种时间复杂度为 O(n) 且空间复杂度为 O(1) 的优秀算法。基本思想是两两抵消不同的元素,最后剩下的元素可能是多数元素。

这里将展开摩尔投票法的具体实现步骤:

  1. 初始化一个候选人candidate和计数器count为0。
  2. 遍历数组中的每个元素x:
    • 如果count为0,则将candidate设置为xcount设置为1。
    • 如果x等于candidate,则count加1。
    • 否则,count减1。
  3. 经过上述过程,candidate应该是多数元素。

性能优化关键点

  • 摩尔投票法在时间和空间复杂度上是最优的,时间复杂度为 O(n),空间复杂度为 O(1)。
  • 由于这种算法不需要额外的存储空间(除了几个基本变量),它特别适合处理大数据量的问题。
3. 代码实现
#include <stdio.h>int majorityElement(int* nums, int numsSize) {int candidate = 0;int count = 0;for (int i = 0; i < numsSize; i++) {if (count == 0) {candidate = nums[i];}if (nums[i] == candidate) {count++;} else {count--;}}return candidate;
}

这个函数的作用是寻找一个整数数组中的多数元素,即在数组中出现次数超过一半的元素。函数采用了一种名为“摩尔投票算法”(Boyer-Moore Voting Algorithm)的高效方法来实现这一目标。

摩尔投票算法的核心思想是通过一系列的比较和计数来找到可能的候选者,然后验证这个候选者是否真的是多数元素。具体到这个函数,它首先初始化两个变量:candidate用于存储当前的候选者,而count用于记录这个候选者的计数值

函数的处理流程大致如下:

  1. 遍历输入数组nums,数组的大小为numsSize
  2. 对于每个元素nums[i],首先检查count是否为0。如果为0,说明前面的所有候选者都被完全抵消了,需要重新选取当前元素作为新的候选者,并重置计数为1。
  3. 接下来验证当前元素是否等于候选者candidate:
    • 如果相等,则增加count的值,表示候选者获得了支持。
    • 如果不等,则减少count的值,表示候选者失去了一些支持。
  4. 经过一轮完整的遍历后,candidate变量中存储的就是数组中的多数元素。

这个算法的优势在于它的时间复杂度为O(n),空间复杂度为O(1),非常适合处理大数据集。它巧妙地通过抵消机制避免了需要额外存储空间来记录每个元素的出现次数,而是直接在遍历过程中确定可能的多数元素。

4. 总结

对编程能力的考查主要集中在对数组操作的理解和算法效率的优化上。通过此题,可以加深对线性时间算法设计的理解,尤其是摩尔投票算法的巧妙之处。


http://www.ppmy.cn/embedded/111358.html

相关文章

介绍 Apache Spark 的基本概念和在大数据分析中的应用。

Apache Spark 是一个快速、通用、可扩展的大数据处理框架&#xff0c;它最初由加州大学伯克利分校的 AMPLab 开发&#xff0c;并于 2010 年作为开源项目发布。Spark 提供了强大的数据处理能力&#xff0c;旨在通过内存计算来加速数据处理过程&#xff0c;从而比传统的基于磁盘的…

高级java每日一道面试题-2024年9月03日-JVM篇-怎么判断对象是否可以被回收?

如果有遗漏,评论区告诉我进行补充 面试官: 怎么判断对象是否可以被回收? 我回答: 在Java中&#xff0c;判断一个对象是否可以被垃圾回收器&#xff08;Garbage Collector, GC&#xff09;回收&#xff0c;主要涉及到Java的内存管理和垃圾回收机制。Java采用自动内存管理机制…

HTTPS的加密流程

HTTP协议采用的是明文传输&#xff0c;所以就存在数据被截取和修改的危险&#xff0c;比较有名的一件事就是2015的运营商劫持事件&#xff0c;所以针对HTTP协议传输的数据进行加密是非常有必要的&#xff0c;HTTPS就是HTTP协议的基础引入了加密&#xff0c;可以说HTTPSHTTPSSL;…

Haption力反馈设备在机器人遥操作中的应用优势

在工业、医疗、科研等多个领域&#xff0c;机器人遥操作正在成为一项关键技术&#xff0c;它允许操作者在远离实际工作环境的情况下&#xff0c;通过远程控制系统对机器人进行精准操作。Haption Virtuose力反馈设备作为遥操作系统中的重要组成部分&#xff0c;其应用优势日益凸…

LLM - 理解 多模态大语言模型 (MLLM) 的发展与相关技术 (一)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/142063880 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 多模态…

[数据集][目标检测]男女性别检测数据集VOC+YOLO格式9769张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;9769 标注数量(xml文件个数)&#xff1a;9769 标注数量(txt文件个数)&#xff1a;9769 标注…

基于单片机的水产养殖饲料自动投喂系统

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图系统框架图设计获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师&#xff0c;一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机…

C#广泛应用的简洁匿名函数Lambda 表达式

Lambda 表达式是一种简洁的方式来定义匿名函数&#xff08;没有名称的函数&#xff09;。在 C# 中&#xff0c;Lambda 表达式常用于简化代码&#xff0c;尤其是在需要传递函数作为参数或者定义内联方法时。Lambda 表达式的语法和功能在很多 .NET API 中都得到了广泛应用&#x…