java数据结构与算法刷题-----LeetCode697. 数组的度

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846

在这里插入图片描述

方法一:hash表

此方法是工作中时间可以使用的,因为它的时间和空间复杂度都相对平衡,也较低。下面介绍的方法二,工作中是坚决不可以使用的,因为会造成大量的空间浪费。

解题思路
  1. 先遍历一遍数组,记录每个元素的出现次数,起始下标和结尾下标
  2. 然后遍历hash表,找到最大出现次数的元素,然后通过len = 结尾下标 - 起始下标 +1获取其长度
  3. 如果遇到相同出现次数的元素,选择长度更小的作为答案(题目要求)
代码:时间复杂度O(n) 空间复杂度O(n)

在这里插入图片描述

class Solution {public int findShortestSubArray(int[] nums) {//哈希表,key为nums数组中的元素值。value为int数组,共3个元素保存当前key的[度,起始下标,结尾下标]Map<Integer, int[]> map = new HashMap<Integer, int[]>();int n = nums.length;//数组长度for(int i = 0;i < n ; i++){if(map.containsKey(nums[i])){//如果当前map已经有该数字map.get(nums[i])[0]++;//当前数字的出现次数+1map.get(nums[i])[2] = i;//当前数字出现的末尾下标}else map.put(nums[i],new int[]{1,i,i});//第一次遇到就放入map,出现次数为1,起始下标为i,结尾下标为i}int maxNum = 0, minLen = 0;//maxNum保存拥有最大的度的元素,minLen保存,包含最大度的所有元素且尽可能短的数组长度for(Map.Entry<Integer, int[]> entry: map.entrySet()){int[] arr = entry.getValue();if(maxNum < arr[0]){//如果当前保存的 元素的度, 没有当前遍历元素的度大maxNum = arr[0];//就保留大的度,也就是当前遍历元素的这个,更大的度minLen = arr[2] - arr[1] +1;//更新子数组长度}else if(maxNum == arr[0]){//如果两个元素的度相同,//我们保留更短的子数组长度if(minLen>arr[2] - arr[1] + 1) minLen = arr[2] - arr[1] +1;}}return minLen;//根据题意,返回包含度最大所有元素的最短子数组长度}
}

方法二:数组下标线性索引

此方法的做题效率更高,对于某些题目来说,确实无论是实际应用和做题的角度来说,都是不错的方法。但不是这道题应该使用的方法。对于这道题也只能做题时可以使用一下了。因为它用数组中的值的范围,作为数组x的下标,数组x作为hash表,来进行常数级的存取。但是假设,数组中存储的元素范围是1 ~ 100000000,那么就需要申请长度为100000000的数组空间。假设有一个数组需要处理,[1,2,3,4,4,4,10000000000],如果使用正经的hash表,只需要7个空间。而使用这种方法,空间复杂度就是10000000000。如果实际应用场景你写出这种代码,100%会被辞退的。因此,这个方法,对于这道题,只能大家做题使用,千万不要放到工作场景中。

时间复杂度O(n), 空间复杂度O(maxValue - minValue + 1),空间复杂度是数组中值的取值范围。真的了解一下即可,不推荐使用,纯粹在投机取巧

在这里插入图片描述

class Solution {/**此方法空间复杂度过高,不推荐工作场景下使用,假设nums = [1,2,2,10000000000] 那么空间复杂度就是 10000000000,* 而hash表空间复杂度是4.*/public int findShortestSubArray(int[] nums) {/** 首先,先建立一个数组,用下标来表示nums中所有元素的值。最大值-最小值 +1 就是nums的value值范围 */int min=Integer.MAX_VALUE;//保存数组中元素的最小值int max=Integer.MIN_VALUE;//保存数组中元素的最大值//获取最大最小值for(int i: nums){max=Math.max(max,i);min=Math.min(min,i);}int[] count=new int[max-min+1];//建立数组,数组下标对应nums元素的取值范围,空间复杂度会非常高int maxCount=0;//找到元素的最大出现次数//找到最大次数for(int i:nums){//依次遍历数组元素//以当前元素 - min 作为下标,让count数组对应值+1,代表这个值出现了一次//因为数组下标从0开始,count[0]代表nums数组的最小值,i - min就是count对应下标maxCount=Math.max(maxCount,++count[i-min]);//保存出现次数最大的}if(maxCount==1){//如果最大出现次数为1,直接返回1return 1;}/****否则需要寻找出现次数最大(也就是 == maxCount)的元素,然后获取其起始和末尾下标 */int res=nums.length;int start,end=nums.length-1;int num=0;//寻找for(int i=0;i<count.length;i++){if(count[i]!=maxCount){continue;}start=0;end=nums.length-1;num=min+i;while(start<end&&nums[start]!=num){start++;}while(start<end&&nums[end]!=num){end--;}res=Math.min(res,end-start+1);}return res;}
}

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

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

相关文章

2024-01-25 力扣高频SQL50题目1174. 即时食物配送

题目如下&#xff1a; 配送表: Delivery -------------------------------------- | Column Name | Type | -------------------------------------- | delivery_id | int | | customer_id | int | | order_date…

阅读go语言工具源码系列之gopacket(谷歌出品)----第一集 DLL的go封装

gopacket项目是google出品的golang第三方库&#xff0c;项目源码地址google/gopacket: Provides packet processing capabilities for Go (github.com) gopacket核心是对经典的抓包工具libpcap(linux平台)和npcap(windows平台)的go封装&#xff0c;提供了更方便的go语言操作接…

嵌入式linux学习之系统烧录

1.所需文件 1. 开发板为正点原子stm32mp157,文件可按照linux驱动教程编译&#xff0c;也可在正点原子文档->08、系统镜像\02、出厂系统镜像中找到&#xff1a; 2.烧录 1.拨码开关为000(usb启动)&#xff0c;otg接口接入虚拟机&#xff0c;打开stm32cubeProgrammer: 2.页面…

AP5101C 高压线性 LED恒流驱动器 DFN2*2 LED灯汽车雾灯转向灯

产品描述 AP5101C 是一款高压线性 LED 恒流芯片 &#xff0c; 简单 、 内置功率管 &#xff0c; 适用于6- 100V 输入的高精度降压 LED 恒流驱动芯片。电流2.0A。AP5101C 可实现内置MOS 做 2.0A,外置 MOS 可做 3.0A 的。AP5101C 内置温度保护功能 &#xff0c;温度保护点为 130 …

c# 策略模式

在 C# 中&#xff0c;策略模式是一种行为型设计模式&#xff0c;它定义了一系列算法&#xff0c;并将每个算法封装到具有公共接口的独立类中&#xff0c;使得它们可以互相替换。这样可以使得算法的选择独立于算法的使用者&#xff0c;从而提高了灵活性和可维护性。 以下是策略…

【字节二面算法题】84. 柱状图中最大的矩形

84. 柱状图中最大的矩形 解题思路 从左向右依次遍历数组中的元素如果栈为空或者当前考察的新元素值比栈顶元素大&#xff0c;表明以栈顶元素值为高的矩形面积暂时不能确定&#xff0c;将当前考察的元素入栈&#xff0c;在这个条件下&#xff0c;栈中的元素从栈底到栈顶元素依…

门面模式 Facade Pattern

门面模式 门面模式&#xff08;Facade Pattern&#xff09;&#xff0c;也称之为外观模式&#xff0c;其核心为&#xff1a;外部与一个子系统的通信必须通过一个统一的外观对象进行&#xff0c;使得子系统更易于使用。 在软件开发领域有这样一句话&#xff1a;计算机科学领域…

CQ 社区版 2.8.0 | 支持TiDB、StarRocks,新增列过滤算法、导出模式设置等

Hello&#xff0c;CloudQuery 社区版 2.8.0 已发布&#xff0c;本文将带大家详细解析本次更新的功能~&#xff08;完整的讲解视频可点击 &#x1f449;&#x1f3fb; CloudQuery 社区版2.8.0 功能讲解演示 本期亮点更新 新增支持数据源 TiDB、StarRocks数据保护新增列过滤脱敏…

cmd命令行输出的内容复制粘贴到文本中

cmd程序执行完后按任意键进行结束&#xff0c;无法直接复制命令行里输出的内容&#xff0c;如下图&#xff0c;在Windows系统里按ctrlC&#xff0c;然后该窗口就关闭了&#xff0c;内容也没有复制成功到粘贴板。 解决办法如下&#xff1a; 在上方打开设置 然后在“交互”里打…

JDBC 总结

一、JDBC概述 JDBC&#xff08;Java DataBase Connectivity&#xff09;java数据库连接是一种用于执行SQL语句的Java API&#xff0c;可以为多种关系型数据库提供统一访问&#xff0c; 它由一组用Java语言编写的类和接口组成。有了JDBC,java开发人员只需要编写一次程序,就可以…

Linux系统中虚拟文件系统原理与方法

在 Unix 的世界里&#xff0c;有句很经典的话&#xff1a;一切对象皆是文件。这句话的意思是说&#xff0c;可以将 Unix 操作系统中所有的对象都当成文件&#xff0c;然后使用操作文件的接口来操作它们。Linux 作为一个类 Unix 操作系统&#xff0c;也努力实现这个目标。 虚拟文…

Vue2 和Vue3 有什么区别

一. 根节点不同&#xff1a; vue2中必须要有根标签vue3中可以没有根标签&#xff0c;会默认将多个根标签包裹在一个fragement虚拟标签中&#xff0c;有利于减少内存。 二. 组合式API和选项式API&#xff1a; 在vue2中采用选项式API&#xff0c;将数据和函数集中起来处理&…

LeetCode 2859. 计算 K 置位下标对应元素的和【位操作】1000

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

E4 基于Mysql的游标定义和应用

一、实验目的: 熟练使用MySQL游标的定义和应用。 二、实验要求: 1、基本硬件配置:英特尔Pentium III 以上,大于4G内存&#xff1b; 2、软件要求:Mysql&#xff1b; 3、时间:1小时&#xff1b; 4、撰写实验报告并按时提交。 三、实验内容: 问题1&#xff1a;请写一个存储…

MTP与管理壳(AAS)有异曲同工之妙

在过去的几年中&#xff0c;流程工业中的不同部门&#xff08;例如制药、精细化学品以及食品和饮料部门&#xff09;遇到了一系列共同且可比较的新兴挑战。这些挑战包括&#xff1a; 新产品的需求迅速接连不断&#xff0c;更快交货和更低价格的压力&#xff0c;更多定制产品&a…

【Java并发】聊聊Future如何提升商品查询速度

java中可以通过new thread、实现runnable来进行实现线程。但是唯一的缺点是没有返回值、以及抛出异常&#xff0c;而callable就可以解决这个问题。通过配合使用futuretask来进行使用。 并且Future提供了对任务的操作&#xff0c;取消&#xff0c;查询是否完成&#xff0c;获取结…

面试 Vue 框架八股文十问十答第十期

面试 Vue 框架八股文十问十答第十期 作者&#xff1a;程序员小白条&#xff0c;个人博客 相信看了本文后&#xff0c;对你的面试是有一定帮助的&#xff01;关注专栏后就能收到持续更新&#xff01; ⭐点赞⭐收藏⭐不迷路&#xff01;⭐ 1&#xff09;Vue-Router 的懒加载如何…

代理模式-C#实现

该实例基于WPF实现&#xff0c;直接上代码&#xff0c;下面为三层架构的代码。 目录 一 Model 二 View 三 ViewModel 一 Model using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace 设计模式练…

【Linux】进程间通信——信号量

让大家久等啦&#xff0c;本期我们来讲讲Linux系统中的信号量 目录 一、引入 二、认识信号量 2.1 信号量的概念 2.2 信号量的内核结构 三、关于信号量的接口 3.1 semget 3.2 ipcs -s 3.3 ipcrm -s 3.4 semctl 3.5 semop 四、理解IPC 一、引入 在开始之前我们先来认…

2023.1.21 关于 Redis 主从复制详解

目录 引言 单点问题 分布式系统 主从模式 配置 Redis 主从结构 断开主从关系 切换主从关系 补充知识点一 只读 网络延迟 拓扑结构 一主一从 一主多从 树形主从结构 主从复制的基本流程 数据同步 replicationid offset pzync 运行流程 具体流程 补充知识点二…