题目1.
209.长度最小的子数组
先谈谈我的思路(先尝试用python,写在注解中)但是很快就卡壳了,没有接触过滑动窗口,然后看了视频讲解,链接如下:
class Solution(object):
def minSubArrayLen(self, target, nums):
"""
:type target: int
:type nums: List[int]
:rtype: int
"""
#可以尝试双指针的思路
#快指针先遍历整个数组
n = len(nums)
slow,fast = 0,0
while slow <= n-1 and slow < fast:
for i in range(slow+1,n):
#快指针从慢指针所指的前一个元素开始遍历,直到最后一个元素
if nums[slow] + nums[fast] == target:
return fast - slow + 1
#如果本轮遍历中未找到两个数之和为目标值的两个数
#就要考虑三个以上的数之和
elif (nums[slow]+nums[fast]!=target) and (fast==n-1) and (slow==n-1):
......
接下来是改善思路后的代码,但是运行时间超出限制了(哭哭),最后还是参考了其他大佬的解法
class Solution(object):
def minSubArrayLen(self, target, nums):
#思路转变为双指针滑动窗口
i,j = 0,0
n = len(nums)
ans = 0
#j作为快指针,需要最先遍历到数组中最后一个元素(索引值为n-1)
while j < n:
#使用切片求和
#如果当前窗口的所有数总和小于目标值,我们就移动快指针,扩大区间
#如果当前窗口的所有数总和大于目标值,我们就移动慢指针,缩小区间
if sum(nums[i:j+1]) < target:
j += 1
temp = j - i + 1
if temp < ans:
ans = temp
elif sum(nums[i:j+1]) > target:
i += 1
temp = j - i + 1
if temp < ans:
ans = temp
elif sum(nums[i:j+1]) == target:
ans = j - i + 1
else:
return 0
return ans
#C
代码如下:
class Solution {
public:
int minSubArrayLen(int s, vector<int>& nums) {
int result = INT32_MAX; // 最终的结果
int sum = 0; // 子序列的数值之和
int subLength = 0; // 子序列的长度
for (int i = 0; i < nums.size(); i++) { // 设置子序列起点为i
sum = 0;
for (int j = i; j < nums.size(); j++) { // 设置子序列终止位置为j
sum += nums[j];
if (sum >= s) { // 一旦发现子序列和超过了s,更新result
subLength = j - i + 1; // 取子序列的长度
result = result < subLength ? result : subLength;
break; // 因为我们是找符合条件最短的子序列,所以一旦符合条件就break
}
}
}
// 如果result没有被赋值的话,就返回0,说明没有符合条件的子序列
return result == INT32_MAX ? 0 : result;
}
};
时间复杂度:O(n^2) ;空间复杂度:O(1)
#python
class Solution(object):
def minSubArrayLen(self, target, nums):
if nums is None or len(nums)==0:
return 0
lenf=len(nums)+1
total=0
i=j=0
while (j<len(nums)):
total=total+nums[j]
j+=1
while (total>=target):
lenf=min(lenf,j-i)
total=total-nums[i]
i+=1
if lenf==len(nums)+1:
return 0
else:
return lenf
作者:代码随想录
链接:https://leetcode.cn/problems/minimum-size-subarray-sum/solutions/1706223/by-carlsun-2-iiee/
题目2.
59.螺旋矩阵 II
#python解法
先写思路:
- 初始化一个 n×n 的零矩阵。
- 定义四个边界变量:
left
,right
,top
,bottom
分别表示当前要填充的行的起始和结束位置,以及列的起始和结束位置。 - 使用一个变量
num
来追踪当前要填充的数字,初始化为 1。 - 当
num
小于等于 n2 时,执行以下循环:先从左到右填充上边行(top
行),更新left
和num。然后
从上到下填充最右边的列(right
列),更新top
和num
。接着从右到左填充下边行(bottom
行),更新right
和num
。紧接着从下到上填充最左边的列(left
列),更新bottom
和num
。最后,在每次填充完一行或一列后,要检查是否已经填满了整个矩阵(即num
是否已经等于 n2)
def generateMatrix(n):
if n == 0:
return [ ]
# 初始化矩阵
matrix = [[0] * n for _ in range(n)]
left, right, top, bottom = 0, n - 1, 0, n - 1
num = 1
while num <= n * n:
# 从左到右填充上边行
for j in range(left, right + 1):
matrix[top][j] = num num += 1 top += 1
# 检查是否已填满
if num > n * n:
break
# 从上到下填充最右边的列
for i in range(top, bottom + 1):
matrix[i][right] = num
num += 1
right -= 1
# 检查是否已填满
if num > n * n:
break
# 从右到左填充下边行
for j in range(right, left - 1, -1):
matrix[bottom][j] = num
num += 1
bottom -= 1
# 检查是否已填满
if num > n * n:
break
# 从下到上填充最左边的列
for i in range(bottom, top - 1, -1):
matrix[i][left] = num
num += 1
left += 1
return matrix
#C 滑动窗口
遇到的问题;代码中一开始有几个问题和缺失的部分,包括未定义的变量(如 nums
, i
, j
),未正确处理n为奇数时循环结构的情况,以及没有分配内存给返回的矩阵。此外,''while(n/2)
''这个循环条件可能不会如期望地那样工作,因为它在 n
为奇数时也会执行多次,而不仅仅是一次(除非 n
正好是 2 的幂)。
int main() {
int n = 3;
int returnSize;
int* returnColumnSizes;
int** matrix = generateMatrix(n, &returnSize, &returnColumnSizes);
// 打印矩阵
for (int i = 0; i < returnSize; i++) {
for (int j = 0; j < returnColumnSizes[i]; j++) {
printf("%d ", matrix[i][j]);
}
printf("\n");
}
// 释放内存
for (int i = 0; i < returnSize; i++) {
free(matrix[i]);
}
free(matrix);
free(returnColumnSizes);
return 0;
}
总结,这是两道对个人而言比较有挑战性的题目,都是在看完题目没有思路的情况下看完视频讲解才解答的。