You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

滑动窗口法求解最小长度子数组和:O(n)复杂度下的优化问询

滑动窗口代码执行效率优化方案

你的滑动窗口思路是对的,时间复杂度已经达到O(n),但可以从减少冗余遍历、降低内存开销、简化计算逻辑这几个维度进一步提升执行效率,具体优化点如下:

  • 移除不必要的预遍历操作:
    原代码开头的sum(nums)和target in nums都会单独遍历一次数组,额外增加O(n)时间。其实这两个判断可以直接融入滑动窗口流程:

    • 若整个数组总和不足target,滑动窗口结束后result会保持inf,直接返回0即可,无需提前计算总和;
    • 遍历过程中只要遇到单个元素等于target,直接返回1,不用提前遍历整个数组查找。
  • 避免无意义的切片操作:
    原代码里len(nums[start:end + 1])会生成新子数组再取长度,完全没必要,直接用end - start + 1就能得到子数组长度,节省内存和计算时间。

  • 删除无用变量:
    possible_combinations变量全程未使用,直接删除以减少内存占用。

  • 优化初始状态与循环逻辑:
    原代码初始current_sum = nums[0]的写法会让窗口默认包含第一个元素,逻辑上可以更简洁:设current_sum = 0、start = 0,end从0开始遍历,每次先将当前元素加入current_sum再判断,循环逻辑更统一,也避免了边界情况的额外处理。

  • 提前终止循环:
    一旦找到长度为1的子数组(即某个元素等于target),可以直接返回结果,不用继续执行后续循环。


优化后的代码

class Solution(object):
    def minSubArrayLen(self, target, nums):
        """
        :type target: int
        :type nums: List[int]
        :rtype: int
        """
        min_len = float("inf")
        current_sum = 0
        start = 0

        for end in range(len(nums)):
            current_sum += nums[end]
            
            # 遇到单个元素等于target,直接返回1,提前终止
            if nums[end] == target:
                return 1
            
            # 当当前和满足条件时,尝试缩小左边界,找更小的子数组
            while current_sum >= target:
                min_len = min(min_len, end - start + 1)
                current_sum -= nums[start]
                start += 1

        return min_len if min_len != float("inf") else 0

内容的提问来源于stack exchange,提问作者Rohith Amaz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 02:18:12