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
注意事项:
- 很绕,注意循环不变量——左闭右开,这里是每次走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]
- 注意区间范围,如区间下标 [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()