题目:

给定一个非空且只包含非负数的整数数组 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. nginx 重写(rewrite) 重定向(return error_page) 详解

    使用 rewrite 指令用于重写URL Nginx的rewrite指令用于重写URL,它有几个参数,这些参数定义了如何匹配和重写请求的URL.以下是rewrite指令的常见参数及其说明: Regex ...

  2. Android 获取设备的CPU型号和设备型号

    原文: Android 获取设备的CPU型号和设备型号-Stars-One的杂货小窝 之前整的项目的总结信息,可能不太全,凑合着用吧,代码在最下面一节 CPU型号数据 华为: ro.mediatek. ...

  3. 对TCP/IP协议的理解

    话说两台电脑要通讯就必须遵守共同的规则,就好比两个人要沟通就必须使用共同的语言一样.一个只懂英语的人,和一个只懂中文的人由于没有共同的语言(规则)就没办法沟通.两台电脑之间进行通讯所共同遵守的规则,就 ...

  4. 访问Webapp目录下面的html文件变为代码

    一.问题由来 一位朋友在学习使用Servlet做练习的时候,突然出现一个问题,他去访问自己创建的html文件时,发现返回的数据是html代码,而不是解析后的页面. 很是疑惑,自己尝试着解决这个问题,很 ...

  5. 一种OSD 简单实现 (文字反色---opencv、字体切换---freetype2(中文、空格))

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  6. HMAC算法:数据传输的保护神

    HMAC算法起源: HMAC(Hash-based Message Authentication Code)算法是由Mihir Bellare.Ran Canetti和Hugo Krawczyk于19 ...

  7. 2023年VR虚拟现实的10个应用行业

    1.医疗保健 现代医疗保健的培训方式离不开VR虚拟现实..由于医疗行业的特殊性,不允许拿大量的病人来练手,但医疗又非常注重实践,一些新手医生就缺乏锻炼的机会,而VR虚拟现实技术很好的解决了这一问题.医 ...

  8. Activity、Window、View三者关系

    目录介绍 01.Window,View,子Window 02.什么是Activity 03.什么是Window 04.什么是DecorView 05.什么是View 06.关系结构图 07.Windo ...

  9. 06.Android之消息机制问题

    目录介绍 6.0.0.1 谈谈消息机制Hander作用?有哪些要素?流程是怎样的? 6.0.0.2 为什么一个线程只有一个Looper.只有一个MessageQueue,可以有多个Handler? 6 ...

  10. 记录--前端换肤方案 - element+less无感换肤(无需页面刷新)

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前端换肤方案 - element+less无感换肤(无需页面刷新) 前言 前不久在改造一个迭代了一年多的项目时,增加了一个换肤功能.通过自 ...