长度最小的子数组
【题目简介】
【自写数组解法】
class Solution:def minSubArrayLen(self, target: int, nums: List[int]) -> int:minLength = float('inf')slow = 0fast = 0cur_sum = nums[slow]# 终止条件:fast不能超过最大索引值while slow <= fast and fast <= len(nums)-1:# 需要重新计算时间if cur_sum >= target:minLength = min(minLength, fast-slow + 1)#print(slow, fast, cur_sum, minLength)cur_sum -= nums[slow]slow += 1if cur_sum < target:fast += 1if fast <= len(nums)-1:cur_sum += nums[fast]# print("2: ",slow, fast, cur_sum, minLength)if fast == len(nums) and minLength == float('inf'):return 0return minLength
- 自己写的一种形式,AC了,不过有些地方想的不是很明白;
- 很有意思的一个想法是如果加和大于目标值,则起始位置+1;如果加和小于目标值,则终止位置-1;
- 循环条件:slow小于等于fast,同时fast应该小于等于最大索引值;
- 终止条件:如果fast达到最大索引的时候,并且最小长度依旧是inf时;
- 优化加和计算:一定要避免每次更新slow或者fast需要重复计算所有元素的总和!
螺旋矩阵II (有难度的!)
【题目简介】
- 循环次数:7–>3; 3–> 1; 所以for循环的次数是n//2; 具体的代码是:range(1, 1 + n//2);
- 上边界循环的边界:(1) range( offset-1, n-offset); matrix[offset-1][i];
- 右边界循环的边界:(2)range( offset-1, n-offset); matrix[j][n-offset];
- 下边界循环的边界:(3)range(n-offset, offset-1, -1); matrix[n-offset][i];
- 左边界循环的边界:(4)range(n-offset, offset-1, -1); matrix[j][offset-1];
【随想录解法】
class Solution:def generateMatrix(self, n: int) -> List[List[int]]: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] = countcount += 1for i in range(startx, n - offset) : # 从上至下nums[i][n - offset] = countcount += 1for i in range(n - offset, starty, -1) : # 从右至左nums[n - offset][i] = countcount += 1for i in range(n - offset, startx, -1) : # 从下至上nums[i][starty] = countcount += 1 startx += 1 # 更新起始点starty += 1if n % 2 != 0 : # n为奇数时,填充中心点nums[mid][mid] = count return nums
【自优化解法】
class Solution:def generateMatrix(self, n: int) -> List[List[int]]:# 构建矩阵matrix = [[0] * n for _ in range(n)]# 构建循环loop, mid = n//2, n//2count = 1 # # 螺旋矩阵需要注意规律: 全部围绕offset进行for offset in range(1, loop + 1): # 注意的边界for i in range(offset-1, n - offset): # matrix[offset-1][i] = countcount += 1for j in range(offset-1, n- offset):matrix[j][n-offset] = countcount += 1for i in range(n-offset, offset-1, -1):matrix[n-offset][i] = countcount += 1for j in range(n-offset, offset-1, -1):matrix[j][offset-1] = countcount += 1# 中心区域的特殊处理if n%2 != 0:matrix[mid][mid] = countreturn matrix
- for循环中全部围绕offset进行即可;