企业文化 设计 咨询,搜索引擎优化seo方案,网站建设程序编制,吉安工商注册官方网站#左耳听风 ARST 打卡活动重启#
目录 一、问题
二、解题方法一 三、解题方法二 关于 ARTS 的释义 —— 每周完成一个 ARTS#xff1a; ● Algorithm: 每周至少做一个 LeetCode 的算法题 ● Review: 阅读并点评至少一篇英文技术文章 ● Tips: 学习至少一个技术技巧 ● Share: …#左耳听风 ARST 打卡活动重启#
目录 一、问题
二、解题方法一 三、解题方法二 关于 ARTS 的释义 —— 每周完成一个 ARTS ● Algorithm: 每周至少做一个 LeetCode 的算法题 ● Review: 阅读并点评至少一篇英文技术文章 ● Tips: 学习至少一个技术技巧 ● Share: 分享一篇有观点和思考的技术文章
希望通过此次活动能聚集一波热爱技术的人延续好奇、探索、实践、分享的精神。 一、问题 给定一个非空且只包含非负数的整数数组 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 范围内的整数。 二、解题方法一
def findShortestSubArray(nums):# 统计每个数字出现的频数和第一次出现的位置count {}first_occurrence {}max_degree 0for i, num in enumerate(nums):if num not in count:count[num] 1first_occurrence[num] ielse:count[num] 1# 更新最大度if count[num] max_degree:max_degree count[num]# 找到与最大度相同的数字的最短连续子数组长度min_length float(inf)for num in count:if count[num] max_degree:length i - first_occurrence[num] 1if length min_length:min_length lengthreturn min_length 这段代码实现了一个函数 findShortestSubArray,用于找到给定数组中出现次数最多的数字所对应的最短连续子数组的长度。 具体实现过程如下 1. 首先定义了三个字典变量count、first_occurrence 和 max_degree,分别用于统计每个数字出现的频数、第一次出现的位置以及最大度(即出现次数最多的数字的出现次数)。 2. 然后遍历输入的数组 nums,对于每个数字 num,如果它不在 count 中则将其添加到 count 中并记录其第一次出现的位置否则将其出现次数加一。同时如果当前数字的出现次数大于之前的最大度则更新最大度。 3. 接着遍历 count 中的每个数字如果某个数字的出现次数等于最大度则计算该数字所对应的最短连续子数组的长度。具体来说首先计算该数字最后一次出现的位置与第一次出现的位置之差加一即为该数字所对应的子数组的长度然后将这个长度与之前计算得到的最短连续子数组长度进行比较取较小值作为新的最短连续子数组长度。 4. 最后返回计算得到的最短连续子数组长度。 需要注意的是在计算最短连续子数组长度时需要使用变量 i 来记录当前遍历到的位置因此在循环开始前需要先初始化 i 为 0。 三、解题方法二
def findShortestSubArray(nums):
# 使用哈希表记录每个数字出现的次数和位置
count {}
for i, num in enumerate(nums):
if num not in count:
count[num] [1, i]
else:
count[num][0] 1# 按照出现次数从大到小排序
sorted_count sorted(count.items(), keylambda x: x[1][0], reverseTrue)# 找到出现次数最多的数字所对应的最短连续子数组长度
max_degree sorted_count[0][1][0]
min_length float(inf)for num, (degree, _) in enumerate(sorted_count):if degree max_degree:length nums[_] nums[_ degree] 1if length min_length:min_length lengthreturn min_length 这个实现方式与之前的实现方式类似但是使用了哈希表来记录每个数字出现的次数和位置避免了在遍历数组时多次计算某个数字的出现次数。同时将哈希表中的元素按照出现次数从大到小排序可以减少后续查找的复杂度。最后通过遍历排序后的哈希表找到出现次数最多的数字所对应的最短连续子数组长度。