代码随想录算法训练营第二天| 209.长度最小的子数组、 59.螺旋矩阵II

力扣 209.长度最小的子数组

题目链接:https://leetcode.cn/problems/minimum-size-subarray-sum/

代码随想录讲解:https://programmercarl.com/0209.%E9%95%BF%E5%BA%A6%E6%9C%80%E5%B0%8F%E7%9A%84%E5%AD%90%E6%95%B0%E7%BB%84.html

思路:这个题目还是用到了双指针法,但是是双指针的区间。可以想象成一条毛毛虫,首先右边的指针先动,一直动,直到区间数值相加先大于等于目标数值。那么这时候再动左边的指针,缩短距离,因为有可能更短的距离会符合大于等于目标数值的要求,例如[1,1,1,1,100],目标数值是100,一开始一直动到第五个数字,相加之和才大于等于100,那么这时候左边就要动了,会发现子数组缩短还是满足条件,那么就要更新长度的信息,直到缩短到不符合条件,右边指针再继续动。

class Solution(object):
    def minSubArrayLen(self, target, nums):
        i = 0 #左边指针
        j = 0 #右边指针
        sum = 0
        long = len(nums)
        min_len = float('inf')
        for j in range(long):
            sum += nums[j]
            while sum >= target:
                min_len = min(min_len, j - i + 1) #这里需要一个判断,不能直接min_len = j+i+1
                sum -= nums[i]
                i += 1
            j += 1
        return min_len if min_len != float('inf') else 0

solution = Solution()
target = 4
nums = [1,4,4]
result = solution.minSubArrayLen(target,nums)
print(result)

 力扣 59.螺旋矩阵II

题目链接:https://leetcode.cn/problems/spiral-matrix-ii/

以下是我的错误代码,我在debug的时候发现大循环是无限循环的,没办法结束,尝试过n-1或者n-2去改变数值但是还是错了,但是n/2是按照代码随想录视频写的
class Solution(object):
    def generateMatrix(self, n):
        start_x = 0
        start_y = 0
        offset = 1
        count = 1
        i = 0
        j = 0
        nums = [[0] * n for _ in range(n)]
        while n / 2 :
            while j < n - offset:

                nums[start_x][j] = count
                count += 1
                j += 1
            while i < n - offset:
                nums[i][j] = count
                count += 1
                i += 1
            while j > start_y:
                nums[i][j] = count
                count += 1
                j -= 1
            while i > start_x:
                nums[i][j] = count
                count += 1
                i -= 1
            start_x += 1
            start_y += 1
            offset +=1
            if n%2 == 1:
                nums[i][j] = count
        return nums

solution = Solution()
n = 3
result = solution.generateMatrix(3)
print(result)

以下是代码随想录的正确代码:

class Solution:
    def generateMatrix(self, n: int) -> List[List[int]]:
        nums = [[0] * n for _ in range(n)]
        startx, starty = 0, 0               # 起始点
        loop, mid = n // 2, n // 2          # 迭代次数、n为奇数时,矩阵的中心点
        count = 1                           # 计数

        for offset in range(1, loop + 1) :      # 每循环一层偏移量加1,偏移量从1开始
            for i in range(starty, n - offset) :    # 从左至右,左闭右开
                nums[startx][i] = count
                count += 1
            for i in range(startx, n - offset) :    # 从上至下
                nums[i][n - offset] = count
                count += 1
            for i in range(n - offset, starty, -1) : # 从右至左
                nums[n - offset][i] = count
                count += 1
            for i in range(n - offset, startx, -1) : # 从下至上
                nums[i][starty] = count
                count += 1                
            startx += 1         # 更新起始点
            starty += 1

        if n % 2 != 0 :			# n为奇数时,填充中心点
            nums[mid][mid] = count 
        return nums

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值