热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

LeetCode问题:多数元素II及其高效求解策略——多数投票算法深入解析

针对给定的大小为n的整数数组,本研究探讨了如何找出所有出现次数超过n/3的元素。通过深入分析多数投票算法,提出了一种高效的解决方案,不仅显著提升了计算效率,还保证了算法的准确性和鲁棒性。

题目

Given an integer array of size n, find all elements that appear more
than ? n/3 ? times. The algorithm should run in linear time and in
O(1) space.

相似题目及多数投票算法

第一眼看到这个题,相信许多人都恩给你联想到另一个题目:

给定一个整数数组,找出出现次数大于 n/2 的那个数。

如果是找出出现次数大于n/2的数,解决这个问题的思路并不难,可以用Map扫描一遍,并且统计出现次数。但是这种方法的时间复杂度虽然是O(N),空间复杂度也相应的是O(N)。还有一种方法是多数投票算法,算法的名字虽然没听说过,但是思路相信大多数人还是知道的。

  1. 如果count==0,则将now的值设置为数组的当前元素,将count赋值为1;
  2. 反之,如果now和现在数组元素值相同,则count++,反之count–;
  3. 重复上述两步,直到扫描完数组。

之前做过的题目都是确定数组中有大于n/2的那个数存在的,所以没有了后边的检查步骤。

思路

看到这题首先想到的是出现次数大于? n/3 ?的数不只有一个,思考了一下,这个数最多有两个,最少一个也没有。所以可以用一个大小为2的数组保存候选结果,最后进行筛选。

然后是候选结果的保存,考察答题者的知识迁移能力,可怜的是我迁移了半天也没移对-,-

这里不说我的错误思路了。直接说解题方法吧。

以nums = [8,8,7,7,7]为例

nums中当前遍历的数 候选数组 count数组
8 [8 , 0 ] [1 , 0]
8 [8 , 0 ] [2 , 0]
7 [8 , 7 ] [2 , 1]
7 [8 , 7 ] [2 , 2]
7 [8 , 7 ] [2 , 3]

一行跟第二行的0是默认初始化的值

代码
public class Solution {
    public List majorityElement(int[] nums) {
        List result = new ArrayList();
        if(nums == null || nums.length == 0){
            return result;
        }
        int[] numbers = new int[2];
        int[] count = new int[2];

        for(int i = 0 ; i if(count[0] == 0){
                numbers[0] = nums[i];
            }else if(count[1] == 0 && numbers[0] != nums[i]){
                numbers[1] = nums[i];
            }

            if(numbers[0] == nums[i]){
                count[0]++;
            }else if(numbers[1] == nums[i]){
                count[1]++;
            }else{
                count[0]--;
                count[1]--;
            }
        }

        count[0] = count[1] = 0;
        for(int i = 0 ; i for(int j = 0 ; j if(nums[i] == numbers[j]){
                    count[j]++;
                }
            }
        }

        if(count[0] > nums.length / 3)
            result.add(numbers[0]);
        if(count[1] > nums.length / 3 && numbers[1] != numbers[0])
            result.add(numbers[1]);


        return result;
    }
}

至于最后这一句

if(count[1] > nums.length / 3 && numbers[1] != numbers[0])

为什么要判断numbers[1] != numbers[0],是因为开始的时候初始化为0,要考虑都为0的情况。

版权声明:本文为博主原创文章,未经博主允许不得转载。

LeetCode--Majority Element II & 多数投票算法


推荐阅读
  • importjava.io.*;importjava.util.*;publicclass五子棋游戏{staticintm1;staticintn1;staticfinalintS ... [详细]
  • 本文将从基础概念入手,详细探讨SpringMVC框架中DispatcherServlet如何通过HandlerMapping进行请求分发,以及其背后的源码实现细节。 ... [详细]
  • 在处理大数据量的SQL分页查询时,通常需要执行两次查询来分别获取数据和总记录数。本文介绍了一种优化方法,通过单次查询同时返回分页数据和总记录数,从而提高查询效率。 ... [详细]
  • 嵌套列表的扁平化处理
    本文介绍了一种方法,用于遍历嵌套列表中的每个元素。如果元素是整数,则将其添加到结果数组中;如果元素是一个列表,则递归地遍历这个列表。此方法特别适用于处理复杂数据结构中的嵌套列表。 ... [详细]
  • 本文详细探讨了BCTF竞赛中窃密木马题目的解题策略,重点分析了该题目在漏洞挖掘与利用方面的技巧。 ... [详细]
  • SQL Server 存储过程实践任务(第二部分)
    本文档详细介绍了三个SQL Server存储过程的创建与使用方法,包括统计特定类型客房的入住人数、根据房间号查询客房详情以及删除特定类型的客房记录。 ... [详细]
  • 本文介绍了如何通过C#语言调用动态链接库(DLL)中的函数来实现IC卡的基本操作,包括初始化设备、设置密码模式、获取设备状态等,并详细展示了将TextBox中的数据写入IC卡的具体实现方法。 ... [详细]
  • 本文详细介绍了C++中的构造函数,包括其定义、特点以及如何通过构造函数进行对象的初始化。此外,还探讨了转换构造函数的概念及其在不同情境下的应用,以及如何避免不必要的隐式类型转换。 ... [详细]
  • 数据类型--char一、char1.1char占用2个字节char取值范围:【0~65535】char采用unicode编码方式char类型的字面量用单引号括起来char可以存储一 ... [详细]
  • 解决Visual Studio Code中PHP Intelephense误报问题
    PHP作为一种高度灵活的编程语言,其代码结构可能导致Intelephense插件在某些情况下报告不必要的错误或警告。自1.3.3版本起,Intelephense引入了多个配置选项,允许用户根据具体的工作环境和编程风格调整这些诊断信息的显示。 ... [详细]
  • 本文通过一个具体的实例,介绍如何利用TensorFlow框架来计算神经网络模型在多分类任务中的Top-K准确率。代码中包含了随机种子设置、模拟预测结果生成、真实标签生成以及准确率计算等步骤。 ... [详细]
  • 1#include2#defineM1000103#defineRGregister4#defineinf0x3f3f3f3f5usingnamespacestd;6boolrev ... [详细]
  • 本文详细介绍了iOS应用的生命周期,包括各个状态及其转换过程中的关键方法调用。 ... [详细]
  • Windows操作系统提供了Encrypting File System (EFS)作为内置的数据加密工具,特别适用于对NTFS分区上的文件和文件夹进行加密处理。本文将详细介绍如何使用EFS加密文件夹,以及加密过程中的注意事项。 ... [详细]
  • 本文将详细介绍如何在二进制和十六进制之间进行准确的转换,并提供实际的代码示例来帮助理解这一过程。 ... [详细]
author-avatar
书友59289474
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有