代码随心录第二天|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/

题目描述:

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

 

posted @ 2025-03-28 23:03  米布丁  阅读(677)  评论(0)    收藏  举报