209. 长度最小的子数组
思路:
这道题原本想用后缀和。但是超时了。只能用双指针模拟一个滑动窗口并用一个变量sum去记录窗口内的和。
代码:
class Solution:
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
min_len = 0x3f3f3f3f
sum = 0
i = 0
for j in range(0, len(nums)):
sum += nums[j]
while sum >= target:
cur_len = j - i + 1
min_len = min(min_len, cur_len)
sum -= nums[i]
i += 1
return min_len if min_len != 0x3f3f3f3f else 0
59. 螺旋矩阵 II
思路:
很简单的一道模拟类的题目,只需要想清楚填充的区间即可。
代码:
class Solution(object):
def generateMatrix(self, n):
"""
:type n: int
:rtype: List[List[int]]
"""
arr = [[0 for h in range(0,n)] for i in range(0,n)]
i = 0
j = 0
this_num = 1
while this_num <=n*n:
while j<n and arr[i][j]==0:
arr[i][j] = this_num
j+=1
this_num+=1
j-=1
i+=1
while i<n and arr[i][j]==0:
arr[i][j] = this_num
i += 1
this_num += 1
i-=1
j-=1
while j>=0 and arr[i][j]==0:
arr[i][j] = this_num
j -= 1
this_num += 1
j+=1
i-=1
while i>=0 and arr[i][j]==0:
arr[i][j] = this_num
i -= 1
this_num += 1
i+=1
j+=1
return arr
58. 区间和
思路:
经典的前缀和算法应用。
代码:
import sys
def main():
num = int(int(sys.stdin.readline()))
arr = [int(int(sys.stdin.readline())) for i in range(num)]
arr1 = arr.copy()
for i in range(1,num):
arr1[i] += arr1[i-1]
for line in sys.stdin:
a, b = map(int, line.strip().split())
print(arr1[b]-arr1[a]+arr[a])
if __name__ == '__main__':
main()