百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

LeetCode基础算法题第100篇: 求数组的最短连续子数组

off999 2024-10-01 13:48 32 浏览 0 评论

技术提高是一个循序渐进的过程,所以我讲的leetcode算法题从最简单的level开始写的,然后到中级难度,最后到hard难度全部完。

目前我选择C语言,Python和Java作为实现语言,因为这三种语言还是比较典型的。由于篇幅和精力有限,其他语言的实现有兴趣的朋友请自己尝试。

初级难度说的差不多的时候,我打算再加点其他内容,我可能会从操作系统到协议栈,从分布式聊到大数据框架,从大数据聊到人工智能,... ...。

如果有任何问题可以在文章后评论或者私信给我

我会持续分享下去,敬请您的关注。

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

问题描述:

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

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

注:

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

示例:

C语言实现:

首先,要知道数组的度,就要统计数组中不同数字出现的数量。这需要遍历整个数组,如示例1,数组中元素1和2出现的次数都是2,所以度是2。

再次,连续子数组度和原数组要相同,按照实例我们很容易知道所谓的“最短连续子数组”就是相同的频数最大元素的左边第一个到最右边最后一个这段连续元素组成的数组中最短的那个。如果觉得拗口,请看下面举例说明:

在示例1中,元素1和元素2都是频度最大的元素,元素1的最左边到最右边组成的数组是[1,2,2,3,1],元素2的最左边到最右边组成的数组是[2,2],最后[2,2]作为最短连续子数组。

我们可以将这两个步骤放在一起处理。

代码如下:

我们定义了两个长度是50000的数组,来分别统计不同数字在数组中出现的次数,以及不同数字第一次出现的"位置"。然后开始遍历数组。

(50000的长度是因为题目中对数组元素范围进行了限制,不过50000的长度对于这种算法来说确实不小了。)

代码第6行,统计不同数字出现的次数。

如果该数字第一次出现,那么存储它的位置,注意我们这里存储的是下标加1,主要是为了避免下标为0的情况下的额外处理。

如果该数字不是第一次出现,那么会进入代码10~16这段逻辑中。首先我们计算当前连续数组长度,这个长度是该数字的起始下标到当前位置的长度,是一个闭区间,即包含该数字本身。注意这个长度只是临时的,如果后面该数字再次出现,这个长度就会再次变大。

如果当前该数字出现的次数大于当前已知的"数组的度",那么显然当前数字将是当前已知的频数最大的元素,当前该数字的计数也将会被作为新的"数组的度"(注意在数组没遍历结束之前,这个度都不是最终的度),并且我们我们要将前面获取的len赋值给minLen,它的用途在代码14~16行,当出现另一个最大频数的时候,如示例1那样情况,我们就需要比较哪一个连续子数组长度最短。我们将最短的重新赋值给minLen

通过以上的逻辑最终minLen获得的就是最短连续子数组的长度。

这里注意一种特殊情况,如果数组的度是1,即所有元素都仅出现一次,那么minLen应该返回1,所以minLen的初始值我们设置为1.

python语言的实现:

我们根据nums生成一个Couter对象,在通过most_common方法,将其转换成一个元组列表。

这个列表安装元素出现的个数有序排列的,其中出现次数最大的在最前面。c[0][1]就是频数最大的元素出现的次数,即数组的度,如前所述,如果度为1,直接返回1。

否则我们通过列表生成器生成一个列表entries,它是所有频数最大的元素组成的列表,因为最短连续子数组也仅仅与它们有关。

然后我们开始遍历entries,分别求出它们的最短连续子数组的长度,然后取其最小值即可。

代码如下:

Java语言的实现:

Java实现和C语言基本一致,具体描述请参考上面C语言的部分。

代码如下:

相关推荐

winxp系统版本(winxp 版本)

1、微软官方3个版本:WINDOWSXPHOME(家庭版)、Professional(专业版)、MediaCenter2005(媒体中心版),每个版本的功能不一样。使用最多的是Professional...

打印机无法共享怎么回事(打印机无法共享出去)

共享打印机无法打印原因一:可能是由于病毒死机解决方法:确定是否由于病毒死机,找一张干净(确信无病毒)的系统盘,从A驱动舒上启动电脑,检查此时打印机和主机能否联机。如果正常联机,估计这种故障是由攻击硬件...

ipv6无网络访问权限怎么解决

ipv6无网络访问权限解决方法如下1、点击电脑左下角的开始,进入到开始的菜单栏,在菜单栏中找到“运行”。或者通过快捷键Windows+R打开运行窗口。  2、打开运行的窗口页面后,在页面上输入“CMD...

office ltsc版(Office LTSC版本区别)

office2021和2021ltsc的区别如下:1.更新策略不同。前者采用每个月月度更新的方法,提供功能更新、安全更新。后者不采用每个月月度更新的方法,且不提供功能更新。2.界面不同。2021采用了...

安装win7需要激活吗(现在安装win7旗舰版还需密钥吗)

要激活  Windows7如果是预装在计算机中的,买来之后便不用激活,这里预装指的是在厂商那里。正版的Windows7安装到计算机中,有三十天的试用期,若要永久使用,就要使...

originos 3升级计划公布(originos升级包)

2023年2月。1.OriginOS3.0系统第一批升级时间为11月25日。2、包含iQOONeo7,X80系列,S15系列,iQOO9、iQOO10系列,以及折叠屏XFold系列和大屏XNo...

鸿蒙系统适配第三方机型(鸿蒙 第三方适配)

最新华为官方公布了鸿蒙系统3.0支持的机型名单,具体如下。鸿蒙系统3.0升级名单:1.Mate系列:MateXs2、MateX2、MateXs、Mate40、Mate40Pro、Mate...

imei怎么下载(imei changer apk)

如果您的steam序列号激活了,可以尝试以下方法下载:1.使用steam自带的下载工具,如“下载工具”,在软件的“下载”选项卡中选择“序列号下载”。2.在下载页面中,选择要下载的游戏,然后点击“下...

电脑系统优化软件哪个好(系统优化软件排行榜)

有必要用,非常好用,WINDOWS优化大师是一个网络上下载率极高的系统维护软件。多年未曾清理过系统和硬盘的电脑,系统内部将产生大量的垃圾文件、临时文件、废旧程序等等win10系统不需要经常更新,关闭...

重装系统后硬盘不见了(重装系统后磁盘不见了)

硬盘不见可能是因为重装系统时未正确安装驱动程序或未对硬件进行正确设置。你可以按以下步骤排查问题:进入BIOS检查硬盘是否被识别,尝试重新连接数据线和电源线,更新或安装适当的硬件驱动程序,或者使用硬件故...

冰封u盘装win7系统教程图解(冰封u盘启动装机教程)

1.查找激活工具:通常来说,Win7冰封系统已经包含了必要的驱动,所以如果你的电脑上并没有出现设备错误,那你就可以正常使用。如果你需要添加任何驱动,请尝试从厂商下载相应的驱动并执行自动安装程序。如果...

ppt软件电脑版推荐(电脑ppt软件下载哪个版好)
  • ppt软件电脑版推荐(电脑ppt软件下载哪个版好)
  • ppt软件电脑版推荐(电脑ppt软件下载哪个版好)
  • ppt软件电脑版推荐(电脑ppt软件下载哪个版好)
  • ppt软件电脑版推荐(电脑ppt软件下载哪个版好)
兄弟打印机怎么连接wifi(兄弟打印机怎么连接wifi手机打印)
  • 兄弟打印机怎么连接wifi(兄弟打印机怎么连接wifi手机打印)
  • 兄弟打印机怎么连接wifi(兄弟打印机怎么连接wifi手机打印)
  • 兄弟打印机怎么连接wifi(兄弟打印机怎么连接wifi手机打印)
  • 兄弟打印机怎么连接wifi(兄弟打印机怎么连接wifi手机打印)
uefi模式下找不到硬盘(uefi引导找不到硬盘)

首先你的安装盘必须是从UEFI启动的,然后它才能安装为UEFI启动。(条件:Fat32文件系统,efi文件夹)其次你MBR+BIOS的系统想换成GPT+EFI的,分区得做一点改动,腾出来100M的空...

win7怎么安装蓝牙驱动程序(win7电脑安装蓝牙驱动教程)

方法如下:  1、再开始里点击控制版面,点击【硬件和声音】找到【添加设备】  2、之后再选择你要添加的蓝牙耳机。  3、系统就会提示正在与蓝牙适配器连接,然后提示添加成功。  4、点击“开始”-“...

取消回复欢迎 发表评论: