LeetCode 169. 多数元素 (哈希映射|投票算法)_哈希表根据位置投票-程序员宅基地

技术标签: 算法  

169. 多数元素

题意:
  • 多数:数组中出现次数大于 n 2 \frac{n}{2} 2n 的数
  • 输入一个含有多数元素的数组
  • 找出该多数
解法1 (暴力法)

思路:

  • 找出数组中每一个元素出现的次数
  • 次数保存在一个相同长度的数组中
  • 遍历该数组找出最大值的下标即为多数的下标
class Solution {
    
    public int majorityElement(int[] nums) {
    
        int[] helper = new int[nums.length];
        int count = 0;
        for (int i = 0; i < nums.length; i++) {
    
            count = 0;
            for (int j = 0; j < nums.length; j++) {
    
                if (nums[j] == nums[i]) {
    
                    count++;
                }
            }
            helper[i] = count;
        }
        int max = helper[0];
        int maxOfIndex = 0;
        for (int i = 0; i < helper.length; i++) {
    
            if (helper[i] > max) {
    
                max = helper[i];
                maxOfIndex = i;
            }
        }
        return nums[maxOfIndex];
    }
}
解法2(哈希映射)

思路:

  • 将数组中不同的元素和其出现的次数映射到哈希表中
  • 将哈希表转为Set集合,找出value值最大的entry
  • 返回其key值即多数
class Solution {
    
    public int majorityElement(int[] nums) {
    
        HashMap<Integer, Integer> map = new HashMap<>();
        // 将数组中不同元素的出现次数以键值对的方式映射到map中
        for (int num : nums) {
    
            if (map.containsKey(num)) {
    
                map.put(num, map.get(num) + 1);
            } else {
    
                map.put(num, 1);
            }
        }
        Set<Map.Entry<Integer, Integer>> set = map.entrySet();

        // 找出value值(出现次数)最大的entry
        int max = 0;
        Map.Entry<Integer, Integer> maxEntry = null;
        for (Map.Entry<Integer, Integer> entry : set) {
    
            if (entry.getValue() > max) {
    
                max = entry.getValue();
                maxEntry = entry;
            }
        }
        return maxEntry.getKey();
    }
}
解法3(排序后返回中值)

思路:

  • 将数组升序排序
  • 因为多数占了数组中一半以上的位置
  • 那么数组中的中间位置的元素一定是多数
class Solution {
    
    public int majorityElement(int[] nums) {
    
        Arrays.sort(nums);
        return nums[(nums.length - 1)/2];
    }
}
解法4(Boyer-Moore 投票算法)

思路:

  • 维护一个候选众数 candidate 和它出现的次数 count。初始时 candidate 可以为任意值,count 为 0

  • 遍历数组 nums 中的所有元素,对于每个元素 x,在判断 x 之前,如果 count 的值为 0,我们先将 x 的值赋予 candidate,随后我们判断 x:

    • 如果 x 与 candidate 相等,那么计数器 count 的值增加 1
    • 如果 x 与 candidate 不等,那么计数器 count 的值减少 1
  • 在遍历完成后,candidate 即为整个数组的众数

class Solution {
    
    public int majorityElement(int[] nums) {
    
        int candidate = nums[0];
        int count = 0;

        for (int i = 0; i < nums.length; i++) {
    
            if (count == 0) {
    
                candidate = nums[i];
            } 
            
            if (nums[i] == candidate) {
    
                    count++;
            } else {
    
                    count--;
            }
        }
        return candidate;
    }
}
收获:
  • Java中的Map集合常用API

    返回值 方法 说明
    V put(K key, V value) 存放键值对
    V get(Object key) 通过key获取value
    V remove(Object key) 通过key删除键值对
    boolean containsKey(Object key) 判断集合中是否包含某个key
    boolean containsValue(Object value) 判断集合中是否包含某个value
    Set<Map.Entry<K,V>> entrySet() 将Map集合转为Set集合
  • 求数组最值:

    1. 如果是单纯的求最值:可以用foreach + Math.max
    2. 如果是想通过这个最值求出最大值的下标或者最大entry:不能简化代码,老实用fori
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/k909397116/article/details/108020164

智能推荐

Jetson nano-安装mxnet_jetson nano anzhuang mxnet-程序员宅基地

1.准备相应的依赖包sudo apt updatesudo apt -y install \ build-essential \ git \ graphviz \ libatlas-base-dev \..._jetson nano anzhuang mxnet

T端带配置文件的魔兽世界BOSS被杀世界公告-程序员宅基地

这个代码是Trinity的内核代码。主要功能,。就是BOSS被杀死后,世界BOSS向所有的私服玩家都公告一次。公告的内容在SQL里面配置适合使用在变态魔兽世界私服中。可以实现BOSS击杀公告。你也可以根据此代码扩展更改,实现击杀boss获得奖励什么的 # HG changeset patch # User aa@aa-HP# Date 1367859811 ...

求从n个数组任意选取一个元素的所有组合-程序员宅基地

最近做项目碰到这个问题,如题从n个数组任意选取一个元素的所有组合。比如已知数组是[1,3];[2,4];[5];最后组合结果是[1,2,5];[1,4,5];[3,2,5];[3,4,5]; 网上看了好多帖子,发现写的太复杂,于是自己动手解决。直接贴解决方案:方法一:// 执行组合排列的函数 function doExchange(...

asp.net调用存储过程方法新解-程序员宅基地

http://www.enet.com.cn/eschool/ 2007年01月10日22:04 来源: 【文章摘要】 在使用.net的过程中,数据库访问是一个很重要的部分,特别是在b/s系统的构建过程中,数据库操作几乎成为了一个必不可少的操作。在使用.net的过程中,数据库访问是一个很重要的部分,特别是在b/s系统的构建过程中,数据库操作几乎成为了一个必不可少的操作。调用存储过程实

《OpenACC并行程序设计:性能优化实践指南》一 3.10 使用Score-P和Vampir记录OpenACC运行时事件...-程序员宅基地

3.10 使用Score-P和Vampir记录OpenACC运行时事件编译器和运行时在实现OpenACC指令时有一定的自由度。因此,检查编译器和运行时对OpenACC指令转换和最终程序执行非常重要。例如,kernels指令触发设备初始化、设备内存分配和没有明确指定相应操作的数据传输。OpenACC 2.5引入的分析接口定义了一组事件,这些事件揭示了Op...

【课件制作软件】Focusky教程 | 如何编辑图表?_focusky 动态趋势图-程序员宅基地

Focusky(也称为“FS软件”)增加了图表功能,不仅支持不同类型图表展示,还允许修改图表属性以及元数据。图表有7种展示,分别为“柱状图”、“散点图”、“饼图”、“折线图”、“面积图”、“堆叠图”以及“表格”。1、首先在快捷工具栏里点击“图表”按钮,然后选择“表格”并拖至画布中(不能直接点击缩略图进行添加)【▲图1】2、选中需编辑的图标,点击“编辑数据”按钮后进入图标编辑页面。【▲图..._focusky 动态趋势图

随便推点

ssis 由于在初始化提供程序时出错,导致连接测试失败-程序员宅基地

ssis 由于在初始化提供程序时出错,导致连接测试失败 1、确认用户名和密码是否正确2、删除老连接,重新新建一个连接(经验)_ssis 因为初始化提供者时发生错误

高德地图API——信息窗体InfoWindow_amap.infowindow-程序员宅基地

信息窗体包括InfoWindow和AdvancedInfoWindow两个类,InfoWindow可以实现默认信息窗体、自定义信息窗体,AdvancedInfoWindow是封装了周边搜索和三种路线规划的高级信息窗体。这篇文章只讲述InfoWindow。信息窗体是什么呢?先来看一个最简单的案例&lt;!doctype html&gt;&lt;html&gt;&lt;head&gt; &..._amap.infowindow

eclipse创建Maven项目后在WEB-INF文件夹下没有web.xml文件的解决方法-程序员宅基地

解决方法:右键项目名选择" Java EE Tools "-->选择" Generate Deployment Descriptor Stub "

HTTP缓存机制:强缓存与协商缓存_对比缓存时http几出的-程序员宅基地

HTTP缓存分为两种,强缓存与协商缓存,先来看几张HTTP请求的截图:可以发现请求头/响应头里一些有意思的属性:ETag、Last-Modified、Expires、Cache-Control、Pragma、If-None-Match、If-Modified-Since等,这些都与HTTP缓存有关系强缓存Expires / Cache-ControlExpires是HTTP1.0中的强缓存机制,是一个绝对值时间。Cache-Control是HTTP/1.1中出现的强缓存机.._对比缓存时http几出的

算法笔记notes_notes++-程序员宅基地

冒泡#include <stdio.h>int main(){ int n; scanf("%d", &n); int a[n]; for(int i = 1; i <= n-1; i++){ //进行n-1趟 //第i趟时从a[0]到a[n-i-1]都与他们下一个数比较 for(int j = 0; j < n-i; j++){ if(a[j] > a[j+1]){ int temp = a[j]; a[j] = a[j+1]_notes++

关于aop对目标方法性能影响的一些记录_aop对性能影响-程序员宅基地

关于aop对目标方法性能影响的一些记录今天记录一下自己对aop的一个理解误区,实际上是给过去初入java的自己一个交代数年之前我刚入坑java的时候,公司对日志的打印把控的比较严格,因为项目比较大,大量的日志经常会导致系统整体运行速度不能满足业务需求。那么我的问题来了:logger不是说是使用aop实现的么,aop不是说完全不会影响原有程序的运行的么(所以永远都不要猜一个菜鸟心里在想什么),..._aop对性能影响