用python刷LeetCode DAY 5:长度最小的子数组

用python刷LeetCode DAY 5

题目:209.长度最小的子数组

题目要求:
请添加图片描述

此题若使用暴力法,用两层for循环遍历数组,起始坐标为i,终点坐标为j,代码为

class Solution(object):
    def minSubArrayLen(self, target, nums):
        """
        :type target: int
        :type nums: List[int]
        :rtype: int
        """
        cur_sum = 0
        result = float('inf')   #先取结果为无穷大
        for i in range(len(nums)):
            cur_sum = 0
            for j in range(i, len(nums)):
                cur_sum += nums[j]
                if cur_sum >= target:
                    result = min(result, j - i + 1)  #若j-i+1比result小,则更新result
                    break     # 跳出内循环
        if result != float('inf'):
            return result
        else:
            return 0

时间复杂度为 O ( n 2 ) O(n^2) O(n2),在LeetCode上提交会显示超时不通过,下面探寻一下更优的解法

上面是使用两层for循环遍历数组,导致时间复杂度很高,那我们能不能用一层for循环解此题呢,又要想到我们的双指针法,在此题中很像一个滑动的窗口,所以又叫滑动窗口法,因为文字描述比较困难,大家可以去B站看代码随想录的的解题思路视频
用python实现的代码如下:

class Solution(object):
    def minSubArrayLen(self, target, nums):
        """
        :type target: int
        :type nums: List[int]
        :rtype: int
        """
        cur_sum = 0
        result = float('inf')   # 先取结果为无穷大
        i = 0
        for j in range(len(nums)):   # 终点坐标循环加一
            cur_sum += nums[j]
            while cur_sum >= target:
                result = min(result, j - i + 1)
                cur_sum = cur_sum - nums[i]
                i += 1
        if result == float('inf'):   # 如果不存在符合条件的子数组,即result仍然为无穷大,则返回0。
            return 0
        else:
            return result

时间复杂度降为 O ( n ) O(n) O(n)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值