首页 > 编程语言 >编程题-多数元素

编程题-多数元素

时间:2025-01-11 09:02:29浏览次数:3  
标签:编程 nums int 元素 num 哈希 counts 多数

题目:

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

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

解法一(哈希表):

使用哈希表可以快速统计出每个元素出现的次数,使用哈希映射来存储每个元素以及出现的次数。哈希表中“键”表示出现的元素,而“值”表示元素出现的次数。

使用一个循环遍历数组num并将数组中每个元素加入哈希表中,在这之后,遍历哈希表中所有的键值对,返回值最大的键。如下为代码:

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        //定义哈希表counts
        unordered_map<int, int> counts;
        // majority表示多数的元素,cnt表示多数元素的数量
        int majority = 0, cnt = 0;
        for (int num: nums) {
            ++counts[num];
            if (counts[num] > cnt) {
                majority = num;
                cnt = counts[num];
            }
        }
        return majority;
    }
};

笔者小记:counts哈希表中可以直接使用counts[num]++,即在哈希表添加元素时默认键对应的值为0,再哈希表内之前没有的键中调用公式counts[num]++默认值为1,不用再判断是否为空导致可能会发生的报错现象。

解法二(摩尔投票算法):

由题可知,如果我们把众数记为+1,把其他数记为-1,将它们全部加起来,显然和大于0,从结果本身我们可以看出众数比其他数多。因此我们假设第一个元素为众数+1,若后续不是这个元素则-1,是这个元素则继续+1,直至为0后又遇到不是这个元素的数,此时设置这个数为假设的众数,当遍历完最后一个元素时,剩下的那个元素肯定是这个最多的数,本思想实则上是分治思想,如下代码为:

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        int x = 0, votes = 0;
        for (int num : nums){
            if (votes == 0) x = num;
            votes += num == x ? 1 : -1;
        }
        return x;
    }
};

标签:编程,nums,int,元素,num,哈希,counts,多数
From: https://blog.csdn.net/qq_43287713/article/details/145042319

相关文章

  • Dart语言的并发编程
    Dart语言的并发编程引言在现代软件开发中,处理并发操作是一项重要且复杂的任务。无论是为了提高应用程序的响应速度,还是为了有效利用系统资源,掌握并发编程都是开发者必备的技能。在众多编程语言中,Dart语言以其简洁性和高效性吸引了大量开发者的关注,尤其是在Flutter框架的推......
  • Erlang语言的并发编程
    Erlang语言的并发编程引言并发编程是现代计算机科学中一个重要的研究领域。随着多核处理器的普及,如何有效地利用这些处理器成为了开发者面临的重大挑战。Erlang语言因其独特的设计理念而在并发编程领域中脱颖而出,广泛应用于实时系统和分布式应用中。本文将详细探讨Erla......
  • JAVA2-类与对象编程(1)
    该系列分享倾向于有c语言基础的学习,想学习的指路主页c语言专栏,接下来我们正式开始面向对象编程的分享学习。软件应用:inteliIDEA2020.2一.类与对象的定义1)类是抽象的,概念性的,代表一类事物,即数据类型.2)对象是具体的,实际性的,代表一个具体事物,即实例.3)类是对象的模......
  • LeetCode:83.删除排序链表中的重复元素
    LeetCode:83.删除排序链表中的重复元素classListNode{constructor(val,next){this.val=(val===undefined?0:val)this.next=(next===undefined?null:next)}}vardeleteDuplicates=function(head){letp=head//head......
  • JavaScript 交互逻辑与异步编程
    JavaScript作为前端实现交互逻辑的核心语言,其复杂性和重要性不言而喻。在构建诸如表单验证、菜单展开收起、页面动态加载等交互功能时,我常常需要处理各种事件监听、DOM操作以及数据的动态更新。尤其是当涉及到异步操作,比如从后端接口获取数据并实时更新页面内容时,JavaScript的......
  • 【C++】穿越编程岁月,细品C++进化轨迹,深化入门基石(续章)——揭秘函数缺省参数的魅力、函
    文章目录一、函数缺省参数二、函数重载三、引用1.引用的概念和定义2.引用的特性3.引用的使用4.const引用5.指针和引用的关系四、inline内联函数和nullptr1.inline2.nullptr一、函数缺省参数   缺省参数其实就是默认参数,它是声明或定义函数时为函数的参数指定......
  • 多数元素(排序)
    给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊n/2⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1:输入:nums=[3,2,3]输出:3示例 2:输入:nums=[2,2,1,1,1,2,2]输出:2思路:如果将数组 n......
  • 【嵌入式编程】 C 程序代码如何实现高内聚低耦合
    一、原理篇低耦合,是指模块之间尽可能的使其独立存在,模块之间不产生联系不可能,但模块与模块之间的接口应该尽量少而简单。这样,高内聚从整个程序中每一个模块的内部特征角度,低耦合从程序中各个模块之间的关联关系角度,对我们的设计提出了要求。程序设计和软件工程发展过程中产生的......
  • C++并发编程之基于锁的数据结构的适用场合与需要考虑和注意的问题
    在C++多线程编程中,锁是一种常用的同步机制,用于保护共享数据,防止多个线程同时访问和修改,从而避免数据不一致或其他并发问题。基于锁的数据结构适用于多种并发编程场合,但同时也需要注意一些关键问题。1. 适用的并发编程场合锁在以下几种场合特别有用:1.1 保护共享数据当多个......
  • 详解 C++ 防御性编程声明一个类型 int *(*(*foo)(int))[5];
    C++中有一些语法由于灵活性和强大功能显得非常复杂。例如,复杂声明是许多人在学习C++时遇到的难题之一。下面以一条常被称为“C++最难的声明”为例,逐步拆解它的含义。声明:int*(*(*foo)(int))[5];这是一个看似复杂的C++声明。让我们逐步分析它的含义。1.阅读......