代码随想录算法训练营|Day 2

Day2

209.长度最小的子数组

题目建议: 本题关键在于理解滑动窗口,这个滑动窗口看文字讲解 还挺难理解的,建议大家先看视频讲解。 拓展题目可以先不做。
题目链接:https://leetcode.cn/problems/minimum-size-subarray-sum/
视频讲解:https://www.bilibili.com/video/BV1tZ4y1q7XE
关键点:j代表的是终止位置。确定j以后再开始移动起始位置i

class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        i,sum = 0,0
        min_len = len(nums)+1
        for j in range(len(nums)):
            sum += nums[j]
            while sum >= target:
                min_len = min(min_len,j-i+1)
                sum -= nums[i]
                i += 1
        return min_len if min_len != len(nums)+1 else 0

59.螺旋矩阵II

题目链接:https://leetcode.cn/problems/spiral-matrix-ii/
视频讲解:https://www.bilibili.com/video/BV1SL4y1N7mV/
关键点:循环不变量。原则:左闭右开。处理第一个节点,但最后一个节点留给下一条边处理。

class Solution:
    def generateMatrix(self, n: int) -> List[List[int]]:
        offset=1
        startX,startY = 0,0
        num_loop = n // 2
        mid = n % 2
        count = 0

        matrix = [[0]*n for _ in range(n)]     
        #for offset in range(1, loop + 1) :
        while num_loop:
            #列的起点
            for j in range(startY, n-offset):
                count += 1
                matrix[startX][j] = count
            
            #行的起点
            for i in range(startX, n-offset):
                count += 1
                matrix[i][n-offset] = count

            for j in range(n-offset, startY, -1):
                count += 1
                matrix[n-offset][j] = count

            for i in range(n-offset, startX, -1):
                count+=1
                matrix[i][startY] = count
            
            startX+=1
            startY+=1
            num_loop-=1
            offset += 1
        if mid:
            count+=1
            matrix[startX][startY] = count
        return matrix       

区间和

前缀和
文章讲解:https://www.programmercarl.com/kamacoder/0058.区间和.html**

知识点
1.sys库
2.遍历一个列表,中途有终端,但可以用始终用一个index变量
3.区间和转化为两个前缀和之差

点击查看代码
import sys
input = sys.stdin.read

def main():
    data = input().split()
    index = 0
    num_ele = int(data[index])
    index += 1
    elements = []
    for i in range(num_ele):
        elements.append(int(data[index+i]))
    index += num_ele

    p = [0] * num_ele
    sum = 0
    for i in range(num_ele):
        sum += elements[i]
        p[i] = sum 

    ans = []
    while index < len(data):
        a = int(data[index])
        b = int(data[index+1])
        index+=2

        if a == 0:
            ans.append(p[b])
        else:
            ans.append(p[b]-p[a-1])

    for a in ans:
        print(a)

if __name__ == "__main__":
    main()

开发商购买土地

文章讲解:https://www.programmercarl.com/kamacoder/0044.开发商购买土地.html
理解:类似于前缀和的想法->累计前面遍历过的来求和。
horizontal与vertical两种分割方法分别考虑。
水平分割->对行求和。优化方法在于,不是分别对每行求和以后再次遍历累计,而是一个变量count去求累计的和,每到一行的尾部进行一次分割后的差值考虑。
到第1行尾部->将matrix分割为1:n-1行 count为1行的和
到第2行尾部->将matrix分割为2:n-2行 count为2行的和
...
**
垂直分割类似

点击查看代码
import sys
input = sys.stdin.read

def main():
    data = input().split()
    index = 0
    n = int(data[index])
    m = int(data[index+1])
    index += 2

    matrix = []
    sum = 0

    for i in range(n):
        row=[]
        for j in range(m):
            num = int(data[index])
            index += 1
            row.append(num)
            sum += num
        matrix.append(row)

    res = float('inf')
    
    horizontalCut = 0
    for i in range(n):
        for j in range(m):
            horizontalCut += matrix[i][j]
            if j == m-1:
                res = min(res, abs(sum-2*horizontalCut))

    verticalCut = 0
    for j in range(m):
        for i in range(n):
            verticalCut += matrix[i][j]
            if i == n-1:
                res = min(res, abs(sum-2*verticalCut))
    
    print(res)

if __name__ == "__main__":
    main()
posted @ 2025-06-12 23:58  ForeverEver333  阅读(226)  评论(0)    收藏  举报