LeetCode算法题-Degree of an Array(Java实现)

TCP报文 Flood攻击原理与防御方式 TCP交互过程中包含SYN、SYN-ACK、ACK、FIN和RST报文,这几类报文也可能会被攻击者利用,海量的攻击报文会导致被攻击目标系统资源耗尽、网络拥塞,无法正常提供服务。接下来我们介绍几种常见的Flood攻击的原理和防御方式。 阅读详情

这是悦乐书的第294次更新,第312篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第162题(顺位题号是697)。给定一个由正整数组成的非空数组,该数组的度数被定义为任意元素出现次数最多的次数。你的任务是找到一个(连续的)nums子数组的最小可能长度,它与nums具有相同的度数。例如:

输入:[1,2,2,3,1]

输出:2

说明:输入数组的度数为2,因为元素1和2都出现两次。在具有相同程度的子阵列中:[1,2,2,3,1],[1,2,2,3],[2,2,3,1],[1,2,2],[2,2,3],[2,2],最短的长度是2.所以返回2。


输入:[1,2,2,3,1,4,2]

输出:6


注意:

  • 数组长度将介于1到50,000之间。

  • 数组中的元素是0到49,999之间的整数。

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

按照题目的意思,我们需要先把出现次数最多的元素找出来,然后再找到该元素第一次出现和最后一次出现的索引位置之间的距离,如果存在多个相同最多次数的元素,还需要比较他们之间的最小值。

因此,第一步,将数组元素存入HashMap,得到最大次数;第二步,将出现最多次数的单个或多个元素添加进数组;第三步,找到新数组中每位元素出现的起始位置,计算距离长度,取其中的较小者。

public int findShortestSubArray(int[] nums) {
    if (nums == null || nums.length == 0) {
        return 0;
    }
    Map<Integer,Integer> map = new HashMap<Integer, Integer>();
    int degree = 0;
    for (int num : nums) {
        map.put(num, map.getOrDefault(num, 0)+1);
        // 比较出现次数,取其中较大者
        degree = Math.max(degree, map.get(num));
    }
    // 将最多出现次数相同的元素放入新的数组
    int[] occur = new int[nums.length];
    int index = 0;
    for (Integer key : map.keySet()) {
        if (map.get(key) == degree) {
            occur[index++] = key;
        }
    }
    int min = Integer.MAX_VALUE;
    // 遍历新数组,算出出现次数最多的元素在nums中的索引之差
    for (int i=0; i< index; i++) {
        // 使用双指针,一前一后遍历nums,找到该元素的索引之差
        int start = 0, end = nums.length-1;
        // 申明一个变量,存储索引之差
        int len = Integer.MAX_VALUE;;
        while (start <= end) {
            if (occur[i] == nums[start] && occur[i] == nums[end]) {
                len = end - start +1;
                break;
            } else if (occur[i] == nums[start] && occur[i] != nums[end]){
                end--;
            } else if(occur[i] != nums[start] && occur[i] == nums[end]) {
                start++;
            } else {
                end--;
                start++;
            }
        }
        // 取两者之间的最小值
        min = Math.min(min, len);
    }
    return min;
}

03 第二种解法

我们也可以不使用新数组来存那些出现最多的元素,将HashMap的value类型改为数组即可。依旧使用数组中的元素作为key,value变成了一个包含三个元素的数组,存储次数、首次出现索引、最后一次出现索引,依旧是在第一次循环中就得到degree的值,然后遍历HashMap的value,找到元素索引间隔最小的那个。

public int findShortestSubArray2(int[] nums) {
    if (nums == null || nums.length == 0) {
        return 0;
    }
    int degree = 0;
    // 以nums中的元素为key,以一个含有3个元素的数组为value
    // 该数组第一个元素为当前元素出现的次数,第二个元素为其第一次出现的位置,第三个元素为其最后一次出现的位置
    Map<Integer,int[]> map = new HashMap<Integer, int[]>();
    for (int i=0; i<nums.length; i++) {
        if (map.containsKey(nums[i])) {
            int[] temp = map.get(nums[i]);
            // 更新该元素出现次数
            temp[0]++;
            // 更新该元素最后一次出现的位置(索引)
            temp[2] = i;
        } else {
            map.put(nums[i], new int[]{1, i, i});
        }
        // 更新degree,取两者之间较大值
        degree = Math.max(degree, map.get(nums[i])[0]);
    }
    int min = Integer.MAX_VALUE;
    for (int[] values : map.values()) {
        if (values[0] == degree) {
            min = Math.min(min, values[2] - values[1] + 1);
        }
    }
    return min;
}

04 第三种解法

对于第二种解法,我们可以再简化下,只使用一个循环来处理。

public int findShortestSubArray3(int[] nums) {
    if (nums == null || nums.length == 0) {
        return 0;
    }
    int degree = 0;
    int min = Integer.MAX_VALUE;
    // 以nums中的元素为key,以一个含有2个元素的数组为value
    // 该数组第一个元素为当前元素出现的次数,第二个元素为其最后一次出现的位置
    Map<Integer,int[]> map = new HashMap<Integer, int[]>();
    for (int i=0; i<nums.length; i++) {
        if (!map.containsKey(nums[i])) {
            map.put(nums[i], new int[]{0, i});
        }
        // 出现次数累加
        map.get(nums[i])[0]++;
        // 对degree进行处理
        if (degree < map.get(nums[i])[0]) {
            degree = map.get(nums[i])[0];
            min = i - map.get(nums[i])[1] + 1;
        } else if (degree == map.get(nums[i])[0]) {
            min = Math.min(min, i - map.get(nums[i])[1] + 1);
        }
    }
    return min;
}

05 第四种解法

我们也可以使用两个HashMap,而不使用数组。第一个HashMap的value存每个元素出现的次数,第二个HashMap的value存每个元素出现的初始位置索引。

在循环中,每次去比较第一个HashMap的value,如果比degree大,就更新degree的值,同时算出该元素起始索引和结束索引之间的距离;如果和degree相等,就在两者之间取较小值。

public int findShortestSubArray4(int[] nums) {
    if (nums == null || nums.length == 0) {
        return 0;
    }
    int degree = 0;
    int min = Integer.MAX_VALUE;
    Map<Integer, Integer> map = new HashMap<Integer, Integer>();
    Map<Integer, Integer> map2 = new HashMap<Integer, Integer>();
    for (int i=0; i<nums.length; i++) {
        map.put(nums[i], map.getOrDefault(nums[i], 0)+1);
        if (!map2.containsKey(nums[i])) {
            map2.put(nums[i], i);
        }
        if (degree < map.get(nums[i])) {
            degree = map.get(nums[i]);
            min = i - map2.get(nums[i]) + 1;
        } else if (degree == map.get(nums[i])) {
            min = Math.min(min, i - map2.get(nums[i]) + 1);
        }
    }
    return min;
}

06 小结

算法专题目前已日更超过四个月,算法题文章162+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

AHB—SRAMC项目(结构图,核心代码、Testbench架构) 文章目录一、AHB_SRAMC项目介绍1.1.AHB总线控制单元(ahb_slv_if.v)1.2.SRAM控制单元(sramc_top.v)1.3.主要的传输路径二、结构框图2.1.AHB_SRAMC结构图(重点)2.2.总线控制单元与SRAM控制单元结构图三、部分核心代码(重点理解)四、SystemVerilog Testbench架构(重点)五、目录结构 一、AHB_SRAMC项目介绍 本项... 阅读详情

相关推荐

SAP Script表单开发中ABAP preform方法的实战应用与调试技巧

本文深入探讨了在SAP Script表单开发中调用ABAP程序(preform方法)的实战应用与调试技巧。通过一个获取供应商版本名称的实例,详细讲解了如何在SE71中嵌入PERFORM指令、编写ABAP子程序进行数据查询与处理,并重点介绍了使用SAP Script Debugger进行高效调试的方法,帮助开发者灵活扩展表单功能,实现复杂业务逻辑。

o0p1q2r3的博客 554

leetcode 697. Degree of an Array(数组的度)

Given a non-empty array of non-negative integers nums, the degree of this array is defined as the maximum frequency of any one of its elements. Your task is to find the smallest possible length of a (contiguous) subarray of nums, that has the same degree a

蓝羽飞鸟的博客 229

.NET适配HarmonyOS进展 1. 前言

目前国产化系统浪潮下,适配鸿蒙是中国软件大势所趋,.NET作为最适合开发客户端语言之一,适配鸿蒙系统(HarmonyOS Next)是目前.NET开发者最关心的事情。我目前业余时间正在移植Avalonia到HarmonyOS,去年在.NET Conf CN上分享过,目前又取得一点进展,所以本文把所有问题进行整合与大家进行分享。

2301_76476890的博客 1462

Degree of an Array【一个数组的度】

PROBLEM:Given a non-empty array of non-negative integers nums, the degree of this array is defined as the maximum frequency of any one of its elements.Your task is to find the smallest possible length...

Sim0Hayha的博客 405

小米手机Magisk解锁与Root完整指南:从Bootloader到模块管理

Android系统Root权限获取是设备深度定制的核心技术之一,其核心原理在于通过修改系统启动流程获取超级用户权限。Systemless Root技术通过动态挂载修改,在不触碰系统分区的前提下实现功能注入,既保证了系统完整性,又能绕过完整性检测。这一技术为设备带来了极高的可定制性,用户可以通过模块化方式增强系统功能、修改UI界面或启用隐藏特性。在小米手机生态中,由于官方提供了完整的Bootloader解锁通道,结合Magisk的无系统修改Root方案,使得安全可控的深度定制成为可能。本文聚焦于Bootloa

weixin_29164185的博客 337

零基础玩转STM32CubeIDE LL库:5分钟搞定串口通信(附完整代码)

本文为零基础开发者提供了一份STM32CubeIDE LL库串口通信的快速实战指南。通过CubeMX配置、LL库核心API详解,以及中断接收与环形缓冲区的完整代码实现,帮助读者在5分钟内搭建稳定可靠的串口收发框架,解决从HAL切换到LL库的常见困惑,提升嵌入式开发效率。

weixin_29159441的博客 308

leetcode 697. Degree of an Array 数组的度(简单)

首先给数组的度下一个定义,给一个数组,某个或某些数字出现最多的次数为该数组的度。题目要求我们找到最短的子数组使其和原数组拥有相同的度。

ln_ydc的专栏 339

9、眼底图像智能分析:糖尿病视网膜病变的自动化识别与分级系统

本博客介绍了一种基于深度学习的糖尿病视网膜病变(DR)自动化识别与分级系统。该系统通过视网膜图像的预处理、数据增强、集成模型的构建与优化,实现了对DR的高效识别与分级。识别系统采用二分类任务,准确率达到97.67%,而分级系统通过四分类策略取得了95.2%的准确率。系统在基层社区和医院中具有广泛的应用前景,为DR的早期筛查和精准诊断提供了有效工具。

pea55的博客 146

LeetCode#697 Degree of Array

1、比较笨的方式是先用vector给每一个元素计数(注意这个vector的长度,原数组可能有负数),然后找到degree并记录哪些元素是候选项;再针对每一个候选项遍历原数组。 很笨的方法但很有效; if(nums.size() == 1) return 1; vector&lt;int&gt;::iterator iter = max_element(nums.begin()...

rpybd的博客 162

【YOLOv11工业级实战】15. YOLOv11海洋监测实战:珊瑚礁健康评估(水下图像增强|机器人搭载)

摘要:本文针对珊瑚礁健康评估的海洋监测需求,基于YOLOv11提出解决方案,聚焦水下色偏、悬浮物干扰、珊瑚形态复杂三大难题。引用全球珊瑚礁监测网络(GCRMN)标准,采用CoralNet数据集,通过Jaffe-McGlamery物理模型引导增强与悬浮物去除算法,在浑浊水域(能见度<5m)实现87.3%的健康珊瑚识别率,藻类误判率低至7.2%。介绍了以BlueROV2水下机器人和Jetson AGX Orin为核心的部署方案,结合水下SLAM定位技术,实现珊瑚健康的实时评估与三维覆盖率计算。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1644

信息传输仿真:卫星通信系统仿真_(12).卫星通信系统仿真软件介绍

卫星通信系统仿真软件是进行卫星通信系统设计和性能优化的重要工具。通过这些软件,用户可以模拟和分析各种通信场景,验证不同的通信协议和算法,优化系统参数和配置。本节介绍了 MATLAB Simulink、NS-3、OPNET 和 SystemVue 的基本功能、特点和配置方法,希望对读者在选择和使用仿真软件时提供参考。在实际应用中,建议根据项目需求和团队能力,综合考虑选择合适的仿真软件。

2401_87715305的博客 1281

【Leetcode】697. 数组的度(Degree of an Array)

Leetcode - 697 Degree of an Array (Easy) 题目描述:数组的度是指数组中出现次数最多的元素的出现次数,例如数组 [1,2,2,2,1] 的度为 3,要求找到长度最小的子数组且该子数组的度与原数组的度相同。 Input: [1, 2, 2, 3, 1] Output: 2 Explanation: The input array has a degree of...

厉兵秣码 230

基于STC8G1K08A单片机的PCA捕获外部信号(100~1000HZ)程序实现

基于STC8G1K08A单片机的PCA捕获外部信号(100~1000HZ)程序实现

weixin_74013772的博客 256

[java] LeetCode 697. Degree of an Array | 数组的度

题目描述 解题思路 这题需要我们找到满足最大频数的最小子序列,最大频数的出现必然是某个值或频数相等的某几个值,最短的子序列即在原序列中截取得到包含所有该数的子序列,如上例子中就是把最左边的2的左边的数全部去掉,最右边的2的右边的数全部去掉。 第一步:找到出现频数最高的数,它可能是一个或者多个。 第二步:分别截取包含所有这些数的最短连续数组。 第三步:返回以上几种情况中的最短的连续数组长度。 代码...

马一凡的博客 318

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

LeetCode-697. Degree of an Array [C++][Java]

Given a non-empty array of non-negative integersnums, thedegreeof this array is defined as the maximum frequency of any one of its elements. Your task is to find the smallest possible length of a (contiguous) subarray ofnums, that has the same degree

贫道绝缘子的博客 190

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

【Leetcode】697. Degree of an Array

题目地址: https://leetcode.com/problems/degree-of-an-array/ 给定一个数组AAA,求其一个子数组的长度,该子数组包含了某个在AAA中出现的最多次数的数(该数字要全包括进去)。返回满足条件的最短子数组的长度。 思路是哈希表。开两个哈希表,一个用来数一下每个数出现了多少次,另一个用来记录每个数出现的第一次的位置和最后一次的位置。然后找到出现次数最多的数有哪些,找到之后,算一下这些数出现的第一次和最后一次的位置之差加111即可。代码如下: import java.

数学、算法爱好者的博客 158

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

leetcode-697. Degree of an Array

697. Degree of an Array Given a non-empty array of non-negative integers nums, the degree of this array is defined as the maximum frequency of any one of its elements. Your task is to find t

link98 586

697. Degree of an Array*

697. Degree of an Array* https://leetcode.com/problems/degree-of-an-array/ 题目描述 Given a non-empty array of non-negative integers nums, the degree of this array is defined as the maximum frequency of a...

珍妮的选择的博客 316

LeetCode_697_Degree of an Array

题目描述Given a non-empty array of non-negative integers nums, the degree of this array is defined as the maximum frequency of any one of its elements.Your task is to find the smallest possible length of a

Otar 929

[LeetCode]Degree of an Array 数组的度

链接:https://leetcode.com/problems/degree-of-an-array/description/难度:Easy题目:697. Degree of an Array Given a non-empty array of non-negative integers nums, th...

weixin_34343689的博客 100

Leetcode——697. Degree of an Array

题目原址 https://leetcode.com/problems/degree-of-an-array/description/ 题目描述 Example1: Input: [1, 2, 2, 3, 1] Output: 2 Explanation: The input array has a degree of 2 because both elements

想当厨子的程序媛 336

【Array-easy】697. Degree of an Array 阿里

1. 题目原址 https://leetcode.com/problems/degree-of-an-array/ 2. 题目描述 3. 题目大意 给定一个数组,degree为一个数组中的元素出现频率最大值。要求寻找这个数组中出现频率最大的元素的最小距离。 4. 解题思路 定义两个数组,一个数组degree存储的是这个元素出现的频率, 另一个数组 head存储的是元素对应的最近的下标位置 首先...

想当厨子的程序媛 202

[leetcode]Array-697. Degree of an Array

Given a non-empty array of non-negative integers nums, the degree of this array is defined as the maximum frequency of any one of its elements. Your task is to find the smallest possible length o

chenhan233的博客 253

LeetCode-697:Degree of an Array (度相同的最小子数组)

给定非空非负整数数组,寻找最小连续子数组,使得子数组的度与原数组的度相同,返回子数组的长度

大树先生的博客 5379

LeetCode——697. 数组的度(Degree of an Array)[简单]——分析及代码(Java)

LeetCode——697. 数组的度[Degree of an Array][简单]——分析及代码[Java]一、题目二、分析及代码1. 哈希表(1)思路(2)代码(3)结果三、其他 一、题目 给定一个非空且只包含非负数的整数数组 nums,数组的度的定义是指数组里任一元素出现频数的最大值。 你的任务是在 nums 中找到与 nums 拥有相同大小的度的最短连续子数组,返回其长度。 示例 1: 输入:[1, 2, 2, 3, 1] 输出:2 解释: 输入数组的度是2,因为元素

江南土豆的博客 254

LeetCode Degree of an Array

原题链接在这里:https://leetcode.com/problems/degree-of-an-array/description/ 题目: Given a non-empty array of non-negative integersnums, thedegreeof this array is defined as the maximum frequency of any o...

weixin_30363817的博客 106
上一篇: LeetCode算法题-Count Binary Substrings(Java实现)
下一篇: LeetCode算法题-Search in a Binary Search Tree(Java实现)
程序员小川
博客等级 码龄10年 47粉丝 305原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值