【算法题解】40. 数组的度

news2024/11/26 2:36:30

这是一道 简单

https://leetcode.cn/problems/degree-of-an-array/

题目

给定一个非空且只包含非负数的整数数组 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 。 

提示:

  • n u m s . l e n g t h nums.length nums.length 1 1 1 50 , 000 50,000 50,000 范围内。
  • n u m s [ i ] nums[i] nums[i] 是一个在 0 0 0 49 , 999 49,999 49,999 范围内的整数。

题解

以题目给定的 n u m s = [ 1 , 2 , 2 , 3 , 1 , 4 , 2 ] nums = [1,2,2,3,1,4,2] nums=[1,2,2,3,1,4,2] 为例,出现次数最多的是 元素2,且出现次数是 3,所以给定数组的度是 3
image.png

因为要求子数组的度和给定原数组的度相同,所以子数组必须包含所有的 元素2,也就是上图中绿色背景的部分。然后求得绿色部分的长度就是本题的答案。

首先求数组的度,必须要循环遍历数组中的每个元素,并对其计数。使用 哈希表key 为元素,value 为出现的次数。

其次,当找到出现次数最多的元素后,我们还需要知道它的起始位置 start 和结束位置 end, 才能计算答案 a n s = e n d − s t a r t + 1 ans = end - start + 1 ans=endstart+1。这个时候我们还需要循环遍历一次给定数组。

既然用了两次循环,那么肯定得想办法把他们合并一下呀!不然怎么说的过去嘛!

我们可以只用一个循环,将 value 变成一个数组:

  1. value[0] 存放出现的次数,出现一次加个一。
  2. value[1] 存放起始位置, 第一次出现时直接记录,后续无需更新。
  3. value[2] 存放结束位置,每次出现都更新一遍。

最后循环遍历一下上面计数用到的哈希表,求的数组的度的同时,就可以一并将相同度数的最小子数组的起始位置和结束位置一起求出来啦。

需要注意的是,如果原数组中某几个元素出现的次数相同,且都是最大值,如示例一中的 12。那么每个都取一遍结果,然后取其中的最小值。

Java 代码实现

class Solution {
    private static final Map<Integer, Integer> duMap = new HashMap<>();

    public int findShortestSubArray(int[] nums) {
        // key 存放数据中的元素,value 长度为3,依次存放出现次数、起始位置、结束位置
        Map<Integer, int[]> indexMap = new HashMap<>();

        for(int i = 0; i < nums.length; i++){
            Integer element = nums[i];
            if(indexMap.containsKey(element)){
                // 更新次数
                indexMap.get(element)[0]++;
                // 更新结束位置
                indexMap.get(element)[2] = i;
            }else{
                indexMap.put(element, new int[]{1, i, i});
            }
        }
        
        int count = -1;
        int ans = nums.length;
        for(int[] value : indexMap.values()){
            if(value[0] > count){
                count = value[0];
                ans = value[2] - value[1] + 1;
            }else if(value[0] == count){
                ans = Math.min((value[2] - value[1] + 1), ans);
            }
        }
        return ans;
    }


}

Go 代码实现


func findShortestSubArray(nums []int) int {

    indexMap := make(map[int][]int, 0)

    for i, v := range nums {
        if element, has := indexMap[v]; has {
            element[0]++
            element[2] = i
        } else {
            indexMap[v] = []int{1, i, i}
        }
    }
    count, ans := -1, len(nums)
    
    for _, element := range indexMap {
        if element[0] > count {
            count, ans = element[0], element[2] - element[1] + 1
        } else if element[0] == count {
            ans = min(ans, element[2] - element[1] + 1)
        }
    }
    return ans
}

func min(a, b int) int {
    if a < b {
        return a
    }
    return b
}

复杂度分析

时间复杂度 O ( N ) O(N) O(N), N 为给定数组的大小。

空间复杂度 O ( N ) O(N) O(N), N 为给定数组的大小。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/666691.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

谈找工作途径

谈找工作 目录概述需求&#xff1a; 设计思路实现思路分析1.51job2.拉钩 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wait for change,challenge Survi…

QT日历制作

文章目录 前言一、QCalendar 类介绍二、界面布局三、代码讲解1. lable 添加图片2. 设置主窗口背景色3. 日历显示改变网格线颜色4. 显示表头日期 总结 前言 在 Qt 中&#xff0c;QCalendar 类是提供日历功能的类。它用于操作和管理日期和时间信息&#xff0c;包括日期计算、日期…

为什么黑客不黑赌博软件?如何成为一名顶级黑客?

攻击了&#xff0c;只是你不知道而已&#xff01; 同样&#xff0c;对方也不会通知你&#xff0c;告诉你他黑了赌博网站。 攻击赌博网站的不一定是正义的黑客&#xff0c;也可能是因赌博输钱而误入歧途的法外狂徒。之前看过一个警方破获的真实案件&#xff1a;28岁小伙因赌博…

Java安装配置教程,2023年最新版,全部版本看这一篇就够了!!

JDK新手无脑安装配置教程❤❤❤ JDK下载网址 ps&#xff1a;如果你的JDK版本在官网没有找到&#xff0c;可以通过第三方资源进行下载&#xff0c;下载安装配置教程是通用的 官方链接>https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html 安装步骤…

【Leetcode60天带刷】day17二叉树——110.平衡二叉树 , 257. 二叉树的所有路径 ,404.左叶子之和

题目&#xff1a; 110. 平衡二叉树 给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡二叉树定义为&#xff1a; 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20…

SpringBoot + Vue前后端分离项目实战 || 二:Spring Boot后端与数据库连接

系列文章&#xff1a; SpringBoot Vue前后端分离项目实战 || 一&#xff1a;Vue前端设计 文章目录 新建Spring后台项目添加依赖 新建数据库IDEA 连接数据库IDEA 自动创建类实体定义数据传递至前端的格式 B站视频讲解&#xff1a;2023全网最简单但实用的SpringBootVue前后端分离…

DJ4-4 NAT、ICMP、IPv6

目录 一、NAT&#xff1a;网络地址转换 1、工作原理 2、NAT 的限制 二、ICMP 1、ICMP 协议 2、ICMP 类型和代码 3、Traceroute 命令 三、IPv6 地址 1、IPv6 的引入 2、IPv6 的表示 一、NAT&#xff1a;网络地址转换 动机&#xff1a;对外部网络来讲&#xff0c;本地…

RISC-V处理器的设计与实现——基本指令集

本人小白一枚&#xff0c;在学习FPGA的过程中偶然刷到了tinyriscv这个开源项目&#xff0c;并且自己对计算机体系结构的知识也很感兴趣&#xff0c;所以想参考这个开源项目做一个基于RISC-V指令集的CPU&#xff0c;下面是tinyriscv这个开源项目的地址&#xff0c;本项目很多思路…

优思学院|六西格玛倡导者与项目赞助人是什么角色?有何区别?

倡导者&#xff08;Champion&#xff09;和项目赞助人&#xff08;Sponsor&#xff09;在正式的六西格玛的组织架构中是两个不同的角色&#xff0c;所以希望在这篇文章中解释一下两个角色的区别。 倡导者&#xff08;Champion&#xff09;是负责组织竞争力和增长的董事和高管&…

quartus 无法识别usb blaster

一、Windows无法正常驱动USB-Blaster 问题:驱动问题 解决方法: 右键我的电脑->管理->设备管理器找到设备USB-Blaster,此时是带有黄色感叹号的 3.右键->更新驱动程序软件 4. 选择“浏览计算机以查找驱动程序软件(R)”,如选择自动搜索是不能安装成功的,…

jQuery 基础语法使用指南

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f93a;&#x1f93a;&#x1f93a; 目录 1. 引入 jQuery 2. jQuery 语法 3. 选择器 …

FusionComputeV100R006C10SPC101平台安装win10踩坑记

生产环境中有一套华为FusionCompute&#xff0c;版本比较老&#xff0c;V100R006C10SPC101&#xff0c;该产品已EOS了&#xff0c;无法升级。因业务需要&#xff0c;需安装Windows10系统&#xff0c;遇到了不少坑&#xff0c;在此记录一下。 一、坑1&#xff1a;Windows10版本…

CAN总线终端电阻

CAN总线终端电阻&#xff0c;一般来说都是120欧姆&#xff0c;实际上在设计的时候&#xff0c;也是两个60欧姆的电阻串起来&#xff0c;而总线上一般有两个120Ω的节点&#xff0c;基本上稍微知道点CAN总线的人都知道这个道理。 但是这两个终端电阻的具体作用是什么呢&#xf…

迅为视频教程 | RKNPU2 从入门到实践一套搞定!

迅为基于瑞芯微RK3568和RK3588处理器设计开发的两款开发板都自带NPU&#xff0c;RK3568自带1T算力的NPU、RK3588自带&#xff16;T算力的NPU&#xff0c;且这两款开发板使用的都是RKNPU2。 &#xff08;RKNPU发展历程&#xff09; RKNPU2较RKNPU1有较大的提升&#xff0c;但市面…

Unity核心9——3D动画

一、3D 动画的使用 ​ 使用导入的 3D 动画&#xff1a; 将模型拖入场景中为模型对象添加 Animator 脚本为其创建 Animator Controller 动画控制器&#xff08;状态机&#xff09;将想要使用的相关动作&#xff0c;拖入 Animator Controller 动画控制器&#xff08;状态机&…

Java:时间日期类

文章目录 DateCalendarDate/Time APILocalDateLocalTimeLocalDateTimeZonedDateTime 功能获取标准时间 参考文献 Date 同样位于java.util包下。 在java中&#xff0c;获取时间最简单的方式就是直接实例化Date类。 以自定义格式&#xff0c;取当前的时间日期&#xff1a; Da…

渗透测试入门指南之小白该如何学习渗透?

前言&#xff1a; 内容都是精华&#xff0c;如果想要入安全的行&#xff0c;强烈建议仔细阅读。 目录&#xff1a; 渗透测试是什么&#xff1f; 学习渗透测试的战略方针是什么&#xff1f; 学习渗透测试的具体方法是什么&#xff1f; 遇到的各种疑难杂症怎么解决&#xf…

践行公益担当 | 关爱留守儿童,暖到“心理”

农民在中国各个时代都扮演着十分重要的角色&#xff0c;为中国的发展做出了卓越的贡献。随着经济的发展&#xff0c;农民为了改善生活而大规模的进城打工&#xff0c;“留守儿童”成为一个新的社会问题&#xff0c;开始在农村甚至部分城市出现。 全国“留守儿童”达6102.55万&…

从0到1精通自动化测试,pytest自动化测试框架,测试用例setup和teardown(三)

目录 一、前言 二、用例运行级别 三、函数式 1、setup_function / teardown_function 2、setup_module / teardown_module 四、类和方法 五、函数和类混合 一、前言 学过 unittest 的都知道里面用前置和后置 setup 和 teardown 非常好用&#xff0c;在每次用例开始前和…

计算机组成原理-复习大纲(期末版)

目录 第一章 计算机系统概论 1.1 冯诺依曼型计算机 1.2 计算机的硬件组成 第二章 运算方法和运算器 2.1 ieee754标准、32位浮点数 2.2 补码运算 2.3 运算器的基本结构形式 第三章 存储系统 3.1 主存与cache的地址映射 3.1.1 全相联映射方式 3.1.2 直接映射方式 3.1.3 组相…