代码随心录第二天|Leecode 209.长度最小的子数组、59.螺旋矩阵
1、Leecode 209.长度最小的子数组
题目链接:https://leetcode.cn/problems/minimum-size-subarray-sum/
题目描述:
解法1----暴力解法
解题思路 :两个for循环,不断寻找符合条件的子序列。

举例:
- 假设给定 s = 7 , nums = [2, 3, 1, 2, 4, 3] ,下面来详细分析代码是如何运行的:
- 外层循环 i = 0
- 初始化 sum = 0 , subLength = 0 , result = INT32_MAX 。
- 内层循环开始, j 从 i = 0 开始:
- 当 j = 0 时, sum = sum + nums[0] = 0 + 2 = 2 ,此时 sum < 7 ,继续循环。
- 当 j = 1 时, sum = sum + nums[1] = 2 + 3 = 5 ,此时 sum < 7 ,继续循环。
- 当 j = 2 时, sum = sum + nums[2] = 5 + 1 = 6 ,此时 sum < 7 ,继续循环。
- 当 j = 3 时, sum = sum + nums[3] = 6 + 2 = 8 ,此时 sum >= 7 ,满足条件。
- 计算子序列长度 subLength = j - i + 1 = 3 - 0 + 1 = 4 ,更新 result = min(result, subLength) = min(INT32_MAX, 4) = 4 ,然后内层循环 break 。
- 外层循环 i = 1
- 初始化 sum = 0 。
- 内层循环 j 从 i = 1 开始:
- 当 j = 1 时, sum = sum + nums[1] = 0 + 3 = 3 ,此时 sum < 7 ,继续循环。
- 当 j = 2 时, sum = sum + nums[2] = 3 + 1 = 4 ,此时 sum < 7 ,继续循环。
- 当 j = 3 时, sum = sum + nums[3] = 4 + 2 = 6 ,此时 sum < 7 ,继续循环。
- 当 j = 4 时, sum = sum + nums[4] = 6 + 4 = 10 ,此时 sum >= 7 ,满足条件。
- 计算子序列长度 subLength = j - i + 1 = 4 - 1 + 1 = 4 ,更新 result = min(result, subLength) = min(4, 4) = 4 ,然后内层循环 break 。
- 外层循环 i = 2
- 初始化 sum = 0 。
- 内层循环 j 从 i = 2 开始:
- 当 j = 2 时, sum = sum + nums[2] = 0 + 1 = 1 ,此时 sum < 7 ,继续循环。
- 当 j = 3 时, sum = sum + nums[3] = 1 + 2 = 3 ,此时 sum < 7 ,继续循环。
- 当 j = 4 时, sum = sum + nums[4] = 3 + 4 = 7 ,此时 sum >= 7 ,满足条件。
- 计算子序列长度 subLength = j - i + 1 = 4 - 2 + 1 = 3 ,更新 result = min(result, subLength) = min(4, 3) = 3 ,然后内层循环 break 。
- 外层循环 i = 3 及之后
- 继续按照上述方式进行内层循环,但是不会再找到比长度为 3 更短的满足条件的子序列。
- 最后,因为 result 被更新为 3 ,所以函数返回 3 ,即数组 nums 中满足元素之和大于或等于 7 的最短连续子序列的长度为 3 ,对应的子序列是 [1, 2, 4] 。
值得注意的是暴力解法时间复杂度过大,会导致超时。
解法2----双指针解法(滑动窗口)
解题思路:一个for循环完成两个for循环需要做的事,一个指针指向滑动窗口的起始位置,另一个指针指向滑动窗口的终止位置, 完成一个不断搜索区间的过程。
举例:
假设 s = 7 , nums = [2, 3, 1, 2, 4, 3] :
- 初始化: result = INT32_MAX , sum = 0 , i = 0 , subLength = 0 。
- 第一次外层循环, j = 0 , sum = sum + nums[0]=2 。此时 sum < s ,不进入内层 while 循环。
- 第二次外层循环, j = 1 , sum = 2+3 = 5 。此时 sum < s ,不进入内层 while 循环。
- 第三次外层循环, j = 2 , sum = 5 + 1=6 。此时 sum < s ,不进入内层 while 循环。
- 第四次外层循环, j = 3 , sum = 6+2 = 8 。此时 sum >= s ,进入内层 while 循环。
- subLength = 3 - 0+1 = 4 , result = 4 , sum = 8 - 2=6 , i = 1 。
- 第五次外层循环, j = 4 , sum = 6+4 = 10 。此时 sum >= s ,进入内层 while 循环。
- subLength = 4 - 1+1 = 4 , result = 4 , sum = 10 - 3=7 , i = 2 。
- 第六次外层循环, j = 5 , sum = 7+3 = 10 。此时 sum >= s ,进入内层 while 循环。
- subLength = 5 - 2+1 = 4 , sum = 10 - 1=9 , i = 3 。
- 再次循环, subLength = 5 - 3+1 = 3 , result = 3 , sum = 9 - 2=7 , i = 4 。
- 再次循环, subLength = 5 - 4+1 = 2 , result = 2 , sum = 7 - 4=3 , i = 5 。
- 最终返回 result = 2 ,即最短子数组长度为2。
2.leecode 59.螺旋矩阵
题目链接:https://leetcode.cn/problems/spiral-matrix-ii/
题目描述:

解题思路:使用二分法,一定坚持循环不变量的原则,边界处理要干净。一圈下来,要画每四条边,每画一条边都要坚持一致的左闭右开,或者左开右闭的原则,这样这一圈才能按照统一的规则画下来。




浙公网安备 33010602011771号