代码随想录算法训练营|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()

浙公网安备 33010602011771号