题目:

给定一个非空且只包含非负数的整数数组 nums,数组的 度 的定义是指数组里任一元素出现频数的最大值。

你的任务是在 nums 中找到与 nums 拥有相同大小的度的最短连续子数组,返回其长度。

示例 1:

输入:nums = [1,2,2,3,1]
输出:2
解释:
输入数组的度是 2 ,因为元素 1 和 2 的出现频数最大,均为 2 。
连续子数组里面拥有相同度的有如下所示:
[1, 2, 2, 3, 1], [1, 2, 2, 3], [2, 2, 3, 1], [1, 2, 2], [2, 2, 3], [2, 2]
最短连续子数组 [2, 2] 的长度为 2 ,所以返回 2 。
示例 2:

输入:nums = [1,2,2,3,1,4,2]
输出:6
解释:
数组的度是 3 ,因为元素 2 重复出现 3 次。
所以 [2,2,3,1,4,2] 是最短子数组,因此返回 6 。

提示:

nums.length 在 1 到 50,000 范围内。
nums[i] 是一个在 0 到 49,999 范围内的整数。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/degree-of-an-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

1.定义三个HashMap,分别用来存储元素的度、元素出现的起始位置以及元素出现的末位置到首位值的长度

2.循环遍历整个数组,找到元素出现的次数、起始位置以及长度

3.循环遍历第一个HashMap的value值,找到数组的最大度

4.循环遍历第一个HashMap的key,如果key 对应的value与数组的最大度相等,则通过比较得到最短连续子数组的长度,输出结果

代码:

 1 class Solution {
2 public int findShortestSubArray(int[] nums) {
3 int n = nums.length;
4 //1.考虑特殊情况
5 if(n == 1){
6 return 1;
7 }
8 //2.定义三个HashMap
9 Map<Integer, Integer> degree = new HashMap<>();
10 Map<Integer, Integer> first = new HashMap<>();
11 Map<Integer, Integer> last = new HashMap<>();
12 //3.循环数组,找到各元素出现的次数、起始位置和最后出现的长度
13 for(int i = 0; i < n; i++){
14 degree.put(nums[i], degree.getOrDefault(nums[i], 0) + 1);
15 if(!first.containsKey(nums[i])){
16 first.put(nums[i], i);
17 }
18 last.put(nums[i], i - first.get(nums[i]) + 1);
19 }
20 //4.找到数组的最大度
21 int maxcount = 0;
22 for(int m : degree.values()){
23 maxcount = Math.max(maxcount, m);
24 }
25 //5.找最短连续子数组
26 int minlength = Integer.MAX_VALUE;
27 for(int key : degree.keySet()){
28 //找到与数组相同的度
29 if(maxcount == degree.get(key)){
30 minlength = Math.min(minlength, last.get(key));
31 }
32 }
33 return minlength;
34
35 }
36 }

小知识:

HashMap的基础知识:

HashMap 是一个散列表,它存储的内容是键值对(key-value)映射

1.创建一个HashMap的对象degree,整型(Integer)的key和整型(Integer)的value:

HashMap<Integer, Integer> degree = new HashMap<Integer, Integer>();

2.添加键值对(key-value)可以使用 put() 方法:

degree.put(nums[i], "baidu")

3.使用 get(key) 方法来获取 key 对应的 value:

degree.get(nums[i])

4.使用 remove(key) 方法来删除 key 对应的键值对(key-value):

degree.remove(nums[i]);

5.删除所有键值对(key-value)可以使用 clear 方法:

degree.clear()

6.计算 HashMap 中的元素数量可以使用 size() 方法:

degree.size()

7.迭代HashMap,可以使用 for-each 来迭代 HashMap 中的元素,如果只想获取 key,可以使用 keySet() 方法,然后可以通过 get(key) 获取对应的 value,如果只想获取 value,可以使用 values() 方法。

 for(int key : degree.keySet()){
//找到与数组相同的度
if(maxcount == degree.get(key)){
minlength = Math.min(minlength, last.get(key));
}
}

8.检查 hashMap 中是否存在指定的 key 对应的映射关系,使用containsKey(key) 方法

if(!first.containsKey(nums[i])){
first.put(nums[i], i);
}

9.获取指定 key 对应对 value,如果找不到 key ,则返回设置的默认值,使用getOrDefault() 方法

degree.getOrDefault( key,defaultValue)

力扣697(java)-数组的度(简单)的更多相关文章

  1. java数组复制的简单方法(一)

    总结:主要是用a数组的长度等于b数组,然后a数组赋值给b数组,我不能想到这个办法,我还是不理解数组中length属性的含义 这里数组并没有正真复制过来,而是一个引用 package com.a; // ...

  2. java(数组及常用简单算法 )

    数组 数组:数组是存储同一种数据类型数据的集合容器. 数组的定义格式: 数据类型[]  变量名  =  new  数据类型[长度]; 数组的好处:对分配到数组对象中每一个数据都分配一个编号(索引值.角 ...

  3. 力扣561. 数组拆分 I-C语言实现-简单题

    题目 传送门 给定长度为 2n 的整数数组 nums ,你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), ..., (an, bn) ,使得从 1 到 n 的 min(a ...

  4. Java实现 LeetCode 697 数组的度(类似于数组的map)

    697. 数组的度 给定一个非空且只包含非负数的整数数组 nums, 数组的度的定义是指数组里任一元素出现频数的最大值. 你的任务是找到与 nums 拥有相同大小的度的最短连续子数组,返回其长度. 示 ...

  5. 力扣485. 最大连续1的个数-C语言实现-简单题

    题目 [题目传送门] 给定一个二进制数组, 计算其中最大连续1的个数. 示例 1: 输入: [1,1,0,1,1,1] 输出: 3 解释: 开头的两位和最后的三位都是连续1,所以最大连续1的个数是 3 ...

  6. 力扣566. 重塑矩阵-C语言实现-简单题

    题目 传送门 在MATLAB中,有一个非常有用的函数 reshape,它可以将一个矩阵重塑为另一个大小不同的新矩阵,但保留其原始数据. 给出一个由二维数组表示的矩阵,以及两个正整数r和c,分别表示想要 ...

  7. 力扣832. 翻转图像-C语言实现-简单题

    题目 传送门 文本 给定一个二进制矩阵 A,我们想先水平翻转图像,然后反转图像并返回结果. 水平翻转图片就是将图片的每一行都进行翻转,即逆序.例如,水平翻转 [1, 1, 0] 的结果是 [0, 1, ...

  8. 力扣算法经典第一题——两数之和(Java两种方式实现)

    一.题目 难度:简单 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数, 并返回它们的数组下标. 你可以假设每种输入只会对应一 ...

  9. java中把list列表转为arrayList以及arraylist数组截取的简单方法

    java中把list列表转为arrayList以及arraylist数组截取的简单方法 package xiaobai; import java.util.ArrayList; import java ...

  10. [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 ma ...

随机推荐

  1. pfx文件导出pem和私钥,更换网站域名证书

    openssl 路径: C:\Program Files\OpenSSL-Win64\bin -- 导出pem证书openssl pkcs12 -in C:\BackUp\Lightning\cert ...

  2. 使用现代身份验证(OAuth)调用 EWS 服务

    我的博客园:https://www.cnblogs.com/CQman/ 转载: https://mp.weixin.qq.com/s?__biz=MzU0MzUxMzU2NA==&mid=2 ...

  3. L7结合Turf.js实现空间分析与数据可视化

    1. 概述 AntV L7 是蚂蚁集团 AntV 数据可视化团队推出的基于 WebGL 的开源大规模地理空间数据可视分析引擎,其特点是通过简单的代码进行配置,即可在前端网页中绘制精美的地图以及相关的图 ...

  4. 利用Python 去重聚合Excel数据并对比两份数据的差异

    问题背景 在数据处理过程中,常常需要将多个数据表进行合并,并进行比对,以便找出数据的差异和共同之处.本文将介绍如何使用 Pandas 库对两个 Excel 数据表进行合并与比对,并将结果输出到新的 E ...

  5. 《.NET内存管理宝典 》(Pro .NET Memory Management) 阅读指南 - 第10章

    本章勘误: 暂无,等待细心的你告诉我哦. 本章注解: 暂无 本章释疑: 暂无,等待你的提问 致谢: MVP 林德熙 MVP 吕毅 sPhinX 相关链接 试读记录

  6. 《.NET内存管理宝典 》(Pro .NET Memory Management) 阅读指南 - 第6章

    本章勘误: 暂无,等待细心的你告诉我哦. 本章注解: 暂无 本章释疑: 暂无,等待你的提问 致谢: MVP 林德熙 MVP 吕毅 sPhinX 相关链接 试读记录

  7. MySQL与Java JDBC数据类型对照

    MySQL数据类型 JAVA数据类型 JDBC TYPE BIGINT Long BIGINT TINYINT Byte TINYINT SMALLINT Short SMALLINT MEDIUMI ...

  8. kingbase ES group by 语句优化

    1.group by 分组语句 在SQL中group by主要用来进行分组统计,分组字段放在group by的后面:分组结果一般需要借助聚合函数实现. group by语法结构 1.常用语法 语法结构 ...

  9. 8分钟搞懂Java中的各种锁

    转载请注明出处️ 作者:测试蔡坨坨 原文链接:caituotuo.top/f9fc66cb.html 前言 你好,我是测试蔡坨坨. 在前几篇Redis相关文章中都说到了锁,同时我们在参加设计评审或者c ...

  10. SQL Server表分区-水平分区3

    目录 一.常用分区步骤 1.创建文件组 2.创建数据文件到文件组里面 3.使用图形界面向导创建分区表(不推荐) 3.使用T-SQL构建分区函数与分区方案(推荐) [3.1]建表时构造 [3.2]已有表 ...