算法通关村-----数组中元素出现次数问题

2023-09-20 15:29:11

数组中出现次数超过一半的数字

问题描述

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。你可以假设数组是非空的,并且给定的数组总是存在多数元素。详见剑指offer39

问题分析

最直接的方式就是使用hashMap,遍历给定数组,将数字和对应出现次数存储在hashMap中,然后再遍历hashMap,找到出现次数最大的数字。除此之外,我们还可以将数据进行排序,升序和降序均可,排序后,出现次数超过一半的元素一定出现在数组的中位数位置。除此之外,还有一种巧妙解法,设立两个变量,num和count,num用于存储当前遍历到的元素,count用于存储次数,如果count为0,则当前元素不可能是出现次数超过一半的元素,则遍历下一个元素。

代码实现

使用HashMap解法

public int majorityElement(int[] nums) {
    Map<Integer,Integer> map = new HashMap<>();
    for(int i=0;i<nums.length;i++){
        if(map.containsKey(nums[i])){
            map.put(nums[i],map.get(nums[i])+1);
        }else{
            map.put(nums[i],1);
        }
    }
    int maxCount = Integer.MIN_VALUE;
    int maxNum = Integer.MIN_VALUE;
    for(int num:map.keySet()){
        if(map.get(num)>maxCount){
            maxCount = map.get(num);
            maxNum = num;
        }
    }
    return maxNum;
}

使用排序解法

public int majorityElement(int[] nums) {
     Arrays.sort(nums);
     return nums[nums.length/2];
}

巧妙解法

public int majorityElement(int[] nums) {
    int result=0;
    int count=0;
    for(int num:nums){
        if(count==0){
            result = num;
        }
        count += result==num?1:-1;
    }
    return result;
}

数组中只出现一次的数字

问题描述

给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。详见leetcode136

问题分析

使用HashMap存储数组元素和元素出现的次数,遍历HashMap,找到出现一次的元素,或者利用HashSet存储元素,利用集合的不可重复性,如果可以添加到集合中,说明当前遍历到的元素在数组中出现一次,直接添加,如果不能添加,说明当前遍历到的元素在数组中出现两次,移除HashSet中的当前元素,最后返回HashSet中的元素,即为数组中只出现一次的元素。除此之外,我们还可以利用位运算来实现。遍历数组元素,进行异或运算,出现两次的元素异或运算结果为0,所有元素的异或运算结果为数组中只出现一次的元素

代码实现

使用HashSet

public int singleNumber(int[] nums) {
    Set<Integer> set = new HashSet<>();
    for(int num: nums){
        if(!set.add(num)){
           set.remove(num);
        }
    }
    Integer[] array = set.toArray(new Integer[set.size()]);
    return array[0];
}

使用异或运算

public int singleNumber(int[] nums) {
    int res = 0;
    for(int num:nums){
        res^=num;
    }
    return res;
}

137. 只出现一次的数字 II

问题描述

给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。

问题分析

使用HashMap存储数组元素和元素出现的次数,遍历HashMap,找到出现一次的元素。另外我们也可以使用位运算来实现对于出现3次的元素,每一位为0或者1,相加为0或者3,可以将每一位相加后对3取余,即为只出现一次的元素的对应位的值。

代码实现

使用位运算实现

public int singleNumber(int[] nums) {
    int res = 0;
    for(int i=0;i<32;i++){
        int total = 0;
        for(int num:nums){
            total+=((num>>i)&1);
        }
        if(total%3!=0){
            res |= (1<<i);
        }
    }
    return res;
}

总结

元素出现次数问题通用方法就是使用HashMap存储元素和对应次数,或许遍历map即可得到想要出现次数的元素。这种方法需要遍历一次数组,遍历一次map,使用一个map,时间复杂度为O(n),空间复杂度为O(n),面试时,可能不允许使用Hash或者集合,即需要我们设计O(n)时间复杂度,常数空间复杂度的算法。此时我们可以考虑常数计数或者为运算等常见方式。

更多推荐

跨境电商如何更好地备战销售旺季?

跨境电商秋促来临!不知道各位卖家是否做好准备了呢?据外媒报道,TikTokShop于近日开启了年度最大规模的黑五大促,而为了抢占旺季流量,继周二亚马逊宣布将于10月10日至11日举办第二届“PrimeBigDealDays”大促后,周三沃尔玛、Target和BestBuy也都宣布将推出自己的大促,提前开启假日促销。这几

Docker进阶:mysql 主从复制、redis集群3主3从【扩缩容案例】

Docker进阶:mysql主从复制、redis集群3主3从【扩缩容案例】一、Docker常规软件安装1.1docker安装tomcat(默认最新版)1.2docker指定安装tomcat8.01.3docker安装mysql5.7(数据卷配置)1.4演示--删除mysql容器,里面的数据是否能正常恢复1.5docke

HTML的学习 Day01

《网页设计与制作》是web前端开发技术中静态网页中的内容,主要包括html、css、js中的静态内容部分,是专业基础课程。随着5G时代的到来,人工智能与物联网结合行业的飞速发展,更多的互联网的崛起。这肯定就比如伴随着对移动互联网领域新的开发场景的需求,需要大量的前端和移动前端开发来呈现。【技术越来越成熟就越要想每一个给

认识面向对象-PHP8知识详解

面向对象编程,也叫面向对象程序设计,是在面向过程程序设计的基础上发展而来的,它比面向过程编程具有更强的灵活性和扩展性。它用类、对象、关系、属性等一系列东西来提高编程的效率,其主要的特性是可封装性、可继承性和多态性。面向对象编程的主要好处就是吧编程的重心从处理过程转移到对现实世界实体的表达。这十分符合人们的正常思维方法。

鞋服零售企业如何进行数字化运营

企业进行信息化和数字化都是在解决同一个问题,降本增效,用信息产生数据,用数据解读业务。在信息化行业操盘十多年,在我的大脑中始终有一个伟大的蓝图,那就是“作战室”,特别是在鞋服零售各种解决方案非常成熟,对作战室的建设几率又大大增加。作战室不仅是数据的可视,更重要的是能指挥作战,如线上线下同步,而线下店铺可视,在通过一个销

百货店失去核心竞争力了吗?全靠超市即时零售撑起

近年来,传统百货不景气,不过,从今年上半年的情况看,似乎有些好转。然而,实际情况并不如预期那么好,有专家认为:“百货上市公司业绩和去年相比增长是正常的。实际上,百货业态增长的可能性几乎为零,如果没有新店开张,没有面积的扩大,单是百货这一块,有增长的可能性不是很大,因为很多上市公司百货店,其实很大一块是有超市带动的,超市

新零售商城模式与传统电商和零售的痛点的对比

新零售是一种以消费者体验为中心的数据驱动的泛零售形态,它通过运用大数据、人工智能等先进技术手段,对商品的生产、流通与销售过程进行升级改造,进而重塑业态结构与生态圈,并对线上服务、线下体验以及现代物流进行深度融合的零售新模式。新零售商城模式是新零售的一种具体实现方式,它通过打造线上线下一体化的商城平台,实现商品、用户和员

Android Fragment

基本概念Fragment是Android3.0后引入的一个新的API,他出现的初衷是为了适应大屏幕的平板电脑,普通手机开发也会加入这个Fragment,可以把他看成一个小型的Activity,又称Activity片段!如果一个很大的界面,就一个布局,写起界面会很麻烦,而且如果组件多的话是管理起来也很麻烦!而使用Frag

深度学习如何入门?

深度学习是一种强大的机器学习方法,它在各个领域都有广泛应用。如果你是一个新手,想要入门深度学习,下面是一些步骤和资源,可以帮助你开始学习和实践深度学习。1.学习基本概念在开始深度学习之前,你需要对一些基本概念有所了解。以下是一些你需要学习的重要概念:神经网络:它从信息处理角度对人脑神经元网络进行抽象,建立某种简单模型,

企业电子招标采购系统源码之从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理

功能描述1、门户管理:所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含:招标公告、非招标公告、系统通知、政策法规。2、立项管理:企业用户可对需要采购的项目进行立项申请,并提交审批,查看所有的立项信息。主要功能包含:招标立项申请、非招标立项申请、采购立项管理。3、采购项目管理:可对项目采购过程全流程管

建构居住安全生态,鹿客科技2023秋季发布会圆满举办

9月20日,以「LockinOpening」为主题的2023鹿客秋季发布会在上海隆重举办,面向居住安全领域鹿客带来了最新的高端旗舰智能锁新品、多眸®OS1.0、LockinCare服务以及全联接OPENING计划。此外,现场还邀请了国家机构、合作伙伴、技术专家等业界同仁共同探讨如何开启居家智能生活新升级。双新品亮相代言

热文推荐