LeetCode每日一题,697. Degree of an Array
先看题目描述
大意就是给定一个数组 nums,再告诉我们数组的度的定义是数组中元素出现的频数的最大值,我们需要找出 nums 中与其度相等的最小连续子数组,并返回其长度
算法和思路
滑动窗口
因为看到题目说找出最小的连续子数组的长度,就想到用滑动窗口做
我们首先定义滑动窗口的度,和数组的度的定义相同,即窗口内元素出现频数的最大值
先求出数组 nums 的度 degree,接下来我们先初始化长度为 0 的滑动窗口,即 left = 0,right = 0,然后我们移动 right 指针来扩张滑动窗口,直至滑动窗口的度达到 degree 时停止滑动窗口的扩张,然后移动 left 指针来收缩滑动窗口直至滑动窗口的度刚好小于 degree。接下来只需重复进行两种操作,当滑动窗口的度小于 degre时,同时移动 left 指针和 right 指针来移动滑动窗口;当滑动窗口的度等于 degree 时,移动 left 指针来收缩滑动窗口。过程中要一直维护滑动窗口的度,最后返回滑动窗口的大小即可
滑动窗口方法的实现细节比较多,具体看代码吧,注意滑动窗口内至多只有一个元素的频数可以达到 degree
算法源码
滑动窗口
1 | class Solution { |
哈希表
这个是题解看到的方法,大致就是求出所有频数和数组的度相等的元素,然后返回这些元素的最晚出现位置和最早出现位置之差的最小值,使用哈希表这个数据结构来实现
1 | class Solution { |