本文共 1989 字,大约阅读时间需要 6 分钟。
为了解决这个问题,我们需要找到一个数组中与原数组度相同的最短连续子数组的长度。度的定义是数组中元素出现频数的最大值。我们可以使用滑动窗口技术来高效地解决这个问题。
这种方法的时间复杂度是O(n),因为每个元素最多被加入和移除一次窗口,适用于大数组的情况。
from collections import defaultdictclass Solution: def findShortestSubArray(self, nums: list[int]) -> int: if not nums: return 0 # 计算整个数组的度 freq = defaultdict(int) max_degree = 0 for num in nums: freq[num] += 1 if freq[num] > max_degree: max_degree = freq[num] min_length = len(nums) current_freq = defaultdict(int) left = 0 for right in range(len(nums)): current_num = nums[right] current_freq[current_num] += 1 # 当前窗口的度 current_degree = max(current_freq.values()) if current_freq else 0 if current_degree == max_degree: window_length = right - left + 1 if window_length < min_length: min_length = window_length # 滑动左指针 while current_degree != max_degree and left <= right: left_num = nums[left] current_freq[left_num] -= 1 if current_freq[left_num] == 0: del current_freq[left_num] if left_num == current_num: current_degree = max(current_freq.values()) if current_freq else 0 left += 1 return min_length
defaultdict
统计每个数的频率,找到最大频率作为原数组的度。min_length
记录最小的满足条件的窗口长度,current_freq
记录当前窗口中各数的频率,left
记录左指针的位置。这种方法高效且直接,能够在O(n)的时间复杂度内解决问题。
转载地址:http://isog.baihongyu.com/