LeetCode169. 多数元素(2024冬季每日一题 39)

news/2024/12/23 21:53:34 标签: 算法, leetcode, 数据结构, 力扣, 投票法

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

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

示例 1:

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

示例 2:

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

提示:

  • n = = n u m s . l e n g t h n == nums.length n==nums.length
  • 1 < = n < = 5 ∗ 1 0 4 1 <= n <= 5 * 10^4 1<=n<=5104
  • − 1 0 9 < = n u m s [ i ] < = 1 0 9 -10^9 <= nums[i] <= 10^9 109<=nums[i]<=109

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


思路:Boyer-Moore 投票算法

  • 如果我们把众数记为 +1,把其他数记为 −1,将它们全部加起来,显然和大于 0,从结果本身我们可以看出众数比其他数多。
  • 我们维护一个候选众数 r e s res res 和它出现的次数 c o u n t count count。初始时 r e s res res 可以为任意值,count 为 0
  • 我们遍历数组 nums 中的所有元素,对于每个元素 x,在判断 x 之前,如果 count 的值为 0,我们先将 x 的值赋予 res,随后我们判断 x:
    • 如果 x 与 res 相等,那么计数器 count 的值增加 1;
    • 如果 x 与 res 不等,那么计数器 count 的值减少 1。
  • 在遍历完成后,res 即为整个数组的众数。
class Solution {
public:
    int majorityElement(vector<int>& nums) {
        int n = nums.size();
        int res = -1, count = 0;
        for(int i = 0; i < n; i++){
            if(nums[i] == res){
                count++;
            }else{
                count--;
                if(count < 0){
                    res = nums[i];
                    count = 0;
                }
            }
        }
        return res;
    }
};

http://www.niftyadmin.cn/n/5797049.html

相关文章

RFdiffusion get_torsions函数解读

函数功能 get_torsions 函数根据输入的原子坐标(xyz_in)和氨基酸序列(seq),计算一组主链和侧链的扭转角(torsions)。同时生成备用扭转角(torsions_alt),用于表示可以镜像翻转的几何结构,并返回掩码(tors_mask)和是否平面化(tors_planar)的信息。 输入参数 xyz…

Spark-Streaming集成Kafka

Spark Streaming集成Kafka是生产上最多的方式&#xff0c;其中集成Kafka 0.10是较为简单的&#xff0c;即&#xff1a;Kafka分区和Spark分区之间是1:1的对应关系&#xff0c;以及对偏移量和元数据的访问。与高版本的Kafka Consumer API 集成时做了一些调整&#xff0c;下面我们…

深入理解 Java 中的 ArrayList 和 List:泛型与动态数组

深入理解 Java 中的 ArrayList 和 List&#xff1a;泛型与动态数组 在 Java 编程中&#xff0c;ArrayList 和 List 是最常用的集合类之一。它们帮助我们管理动态数据&#xff0c;支持按索引访问、增加、删除元素等操作。尤其在使用泛型时&#xff0c;理解它们之间的关系及应用…

未来将要被淘汰的编程语言

COBOL - 这是一种非常古老的语言&#xff0c;主要用于大型企业系统和政府机构。随着老一代IT工作人员的退休&#xff0c;COBOL程序员变得越来越少。Fortran - 最初用于科学和工程计算&#xff0c;Fortran在特定领域仍然有其应用&#xff0c;但随着更现代的语言&#xff08;如Py…

C++中处理对象的状态变化

在C中&#xff0c;处理对象的状态变化通常涉及多个方面&#xff0c;包括封装、观察者模式、状态模式、事件系统等。以下是几种常见的方法和策略&#xff1a; 1. 封装 (Encapsulation) 封装是面向对象编程的基本原则之一&#xff0c;它通过将对象的状态&#xff08;属性&#x…

如何调用yolov8的模型(restful和c++)

文章目录 方法一、通过RESTful API调用(推荐)第一步:部署yolo8服务端第二步:java中调用api方法二、JNI调用(本地调用)第一步:编写c/c++封装代码第二步:生成jni头文件和动态库第三步:在java中调用jni函数其他资料导出模型实际应用的语句1.静态图片分类推理2.静态图片目…

门户文件在线预览如何实现?

1.在线预览方案优劣介绍 1、在线预览方案客户&#xff0c;现在有3个方案&#xff1a; a、Aspose组件,收费是2999美元&#xff0c;折合人民币20000左右,具体可以上官网看看&#xff1a;这个在线预览插件的直接获取的pdf流, b、通过JACOB实现Office文档转换为PDF&#xff0c;Ite…

Java模拟Mqtt客户端连接Mqtt Broker

Java模拟Mqtt客户端基本流程 引入Paho MQTT客户端库 <dependency><groupId>org.eclipse.paho</groupId><artifactId>org.eclipse.paho.mqttv5.client</artifactId><version>1.2.5</version> </dependency>设置mqtt配置数据 …