博客
关于我
LeetCode:697. 数组的度————简单
阅读量:362 次
发布时间:2019-03-05

本文共 1989 字,大约阅读时间需要 6 分钟。

为了解决这个问题,我们需要找到一个数组中与原数组度相同的最短连续子数组的长度。度的定义是数组中元素出现频数的最大值。我们可以使用滑动窗口技术来高效地解决这个问题。

方法思路

  • 计算原数组的度:首先,我们需要计算整个数组的度,即找出出现频率最大的数。
  • 滑动窗口技术:使用滑动窗口技术来维护当前窗口中各数的频率,并记录出现频率最大的数。如果当前窗口的度等于原数组的度,则记录窗口长度,并更新最小值。
  • 处理窗口边界:当左指针滑动时,处理左指针所在的数,如果它的频率为1,则从频率字典中删除它,以避免占用内存。
  • 遍历窗口:遍历所有可能的窗口,找到最小的满足条件的窗口长度。
  • 这种方法的时间复杂度是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/

    你可能感兴趣的文章
    LeetCode:28. 实现 strStr()——————简单
    查看>>
    java 中 private default protected public 范围
    查看>>
    LeetCode:697. 数组的度————简单
    查看>>
    LeetCode:1052. 爱生气的书店老板————中等
    查看>>
    C语言的6大基本数据类型!(学习C语言小白必备!!)
    查看>>
    红黑树学习
    查看>>
    Redis未授权访问漏洞
    查看>>
    SpringBoot整合Redis
    查看>>
    3D案例——旋转木马
    查看>>
    vue中导入导入 Mint-UI的注意事项
    查看>>
    Vue——mock模拟数据的使用
    查看>>
    Nginx配置反向代理与负载均衡
    查看>>
    socket多线程实现tcp server
    查看>>
    高阶函数reduce
    查看>>
    Lionheart万汇:布林线双底形态分析技巧
    查看>>
    Lionheart万汇:台积电大幅提升资本开支,2021有望续创辉煌
    查看>>
    Lionheart万汇:新年消费结构中贵金属交易机会
    查看>>
    LHCM万汇:在需求上升中,美国贸易赤字创下历史新高
    查看>>
    Python数据处理笔记01--numpy数组操作
    查看>>
    大力出奇迹之js文件爆破
    查看>>