代码随想录算法训练营第二天 | 209.长度最小的子数组、59.螺旋矩阵II、区间和、开发商购买土地

77 阅读2分钟

209.长度最小的子数组

思路:

  • 滑动窗口,start用于缩小,end用于扩大,先扩大,扩大到符合target后开始缩小

注意事项:

  • 滑动窗口,循环的是end
  • 注意 sum >= target,如果用的if,只会判断一次,但事实上要持续更新start位置,所以用while
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
    l = len(nums)
    end = 0
    start = 0
    sum = 0
    result = float("inf")

    # 如果循环的是初始点,那就成了暴力法的两层循环了
    while end < l:
        sum += nums[end]
        while sum >= target:
            result = min(end - start + 1, result)
            sum -= nums[start]
            start += 1
        end += 1
    return result if result != float("inf") else 0

59.螺旋矩阵II

image.png

注意事项:

  • 很绕,注意循环不变量——左闭右开,这里是每次走2格,第三格留给下一次
def generateMatrix(self, n: int) -> List[List[int]]:
    ans = [[0] * n for _ in range(n)]
    num = 1
    start_row, start_col = 0, 0
    loop = n // 2 # 转几圈
    mid = n // 2

    for offset in range(1, loop + 1):
        # top
        for i in range(start_col, n - offset):
            ans[start_row][i] = num
            num += 1
        # right
        for i in range(start_row, n - offset):
            ans[i][n - offset] = num
            num += 1
        #bottom
        for i in range(n - offset, start_col, -1):
            ans[n - offset][i] = num
            num += 1
        #left
        for i in range(n - offset, start_row, -1):
            ans[i][start_col] = num
            num += 1
        start_row += 1
        start_col += 1
    # center
    if n % 2 == 1:
        ans[mid][mid] =num
    return ans

区间和

题目链接:kamacoder.com/problempage…

题目描述:给定一个整数数组 Array,请计算该数组在每个指定区间内元素的总和。

输入描述:第一行输入为整数数组 Array 的长度 n,接下来 n 行,每行一个整数,表示数组的元素。随后的输入为需要计算总和的区间,直至文件结束。

输出描述:输出每个指定区间内元素的总和。

思路:

  • 前缀和:创建辅助数组:前n项和。 data = [1, 2, 3, 4, 5] first_n_sum = [1, 3, 6, 10, 15]

  • 如统计2到5项和,只需first_n_sum[5] - first_n_sum[1]

image.png

  • 注意区间范围,如区间下标 [2, 5] 的区间和,那么应该是 p[5] - p[1],而不是 p[5] - p[2]。
import sys
input = sys.stdin.read

def main():
    data = input().split()
    #取出第一个元素,表示array长度
    index = 0
    n = int(data[index])
    index += 1
    
    # vec表示原始数据
    vec = []
    for i in range(n):
        vec.append(int(data[index + i]))
    index += n
    
    # p表示前缀和
    p = [0] * n
    presum = 0
    for i in range(n):
        presum += vec[i]
        p[i] = presum
    
    #初始化一个空列表 results。
    #每次读取两个整数 a 和 b,并将 index 增加 2。
    results = []
    while index < len(data):
        a = int(data[index])
        b = int(data[index + 1])
        index += 2

        if a == 0:
            sum_value = p[b]
        else:
            sum_value = p[b] - p[a - 1]

        results.append(sum_value)

    for result in results:
        print(result)

if __name__ == "__main__":
    main()