博客
关于我
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/

    你可能感兴趣的文章
    c语言(基本数据类型)实参与形参传值 用汇编理解
    查看>>
    输入端噪声容限
    查看>>
    vue——this.$route 与 this.$router
    查看>>
    基于单片机可控音乐流水灯控制设计-全套资料
    查看>>
    基于单片机简易信号误差分析设计-全套资料
    查看>>
    基于单片机简易洗衣机系统仿真设计-全套资料
    查看>>
    基于单片机简易脉搏测量仪系统设计-毕设课设资料
    查看>>
    基于单片机八层电梯系统控制设计-毕设课设资料
    查看>>
    并发框架下的“基础类型”——浅析基本类型、ThreadLocal、原子类的线程安全机制
    查看>>
    Android Studio同步Gradle失败的解决办法
    查看>>
    VHDL代码风格
    查看>>
    C++系列7:回调函数
    查看>>
    图像处理系列1.skimage
    查看>>
    好用的拼图小程序,图作妖
    查看>>
    读取二进制存储信息,将低位二进制存储转换为高位存储
    查看>>
    Hibernate操作Blob,将Blob转换为String
    查看>>
    Object Clone
    查看>>
    Javascript中String支持使用正则表达式的四种方法
    查看>>
    2021年判断浏览器最新写法,你都掌握了吗?
    查看>>
    简易版Http请求工具
    查看>>