力扣209 长度最小的子数组:
本题一开始用暴力法遍历每一个数组,但是结果超时,看了教程,可以使用指针法,定义两个指针,分别作为子数组的起始区间和终止区间,在for循环里面遍历终止区间,然后比较巧妙的是在while里面更新起始区间,每个元素最多提取2次,最终的时间复杂度为O(n)。
代码如下:
class Solution:
def minSubArrayLen(self, s, nums):
l = len(nums)
left = 0
right = 0
cur_sum = 0
min_len = float('inf')
while right < l:
cur_sum += nums[right]
while cur_sum >= s:
min_len = min(min_len, right - left + 1)
cur_sum -= nums[left]
left += 1
right += 1
return min_len if min_len != float('inf') else 0
力扣59 螺旋矩阵II
本题不涉及算法,考察的是代码的实现,难点在于区间的固定。没有什么思路,看完教程也只能勉强实现代码。没有办法,明天早上再重做一遍。
代码如下:
class Solution(object):
def generateMatrix(self, n):
nums = [[0] * n for _ in range(n)]
startx, starty = 0, 0 # 起始点
loop, mid = n // 2, n // 2 # 迭代次数、n为奇数时,矩阵的中心点
count = 1 # 计数
for offset in range(1, loop + 1): # 每循环一层偏移量加1,偏移量从1开始
for i in range(starty, n - offset):
nums[startx][i] = count
count += 1
for i in range(startx, n - offset):
nums[i][n - offset] = count
count += 1
for i in range(n - offset, starty, -1):
nums[n - offset][i] = count
count += 1
for i in range(n - offset, startx, -1):
nums[i][starty] = count
count += 1
startx += 1
starty += 1
if n%2 != 0:
nums[mid][mid] = count
return nums