- 904.水果成篮(opens new window)
- 76.最小覆盖子串(opens new window) (难度为hard 暂时没写)
滑动窗口 双指针的一种实现(时间复杂度为o(n))
滑动窗口 j指向终止位置 如果指向起始位置就和暴力解法一样,故而重点就在于怎么移动起始位置
对于209:滑动窗口的原理是右边先开始走,然后直到窗口内值的总和大于target,此时就开始缩圈,缩圈是为了找到最小值,只要此时总和还大于target,我就一直缩小,缩小到小于target为止在这过程中不断更新最小的长度值,然后右边继续走,如此反复,直到右边碰到边界。这样就保证了可以考虑到最小的情况
考虑三方面:窗口内是什么 如何确定起始位置 如何确定终止位置
是while而不是if 可以一直使left迭代得到最小的子数组
904 水果成篮与209.长度最小的子数组不同的是水果成篮要求在满足条件的情况下收集水果的最大数目。
翻译成计算机语言也就是,209题求解的是满足条件的子数组最小长度,904题求解的是满足条件的子数组最大长度。
同理利用滑动窗口的知识翻译就是,209求解最小滑窗是在迭代右移左边界的过程中更新结果,904题目求解最大滑窗是在迭代右移右边界的过程中更新结果。
螺旋矩阵 与二分法类似 重点在于循环不变量(左闭右闭 左闭右开)
左闭右开(时间复杂度o(n2)遍历的是二维数组)
模拟顺时针画矩阵的过程:
- 填充上行从左到右
- 填充右列从上到下
- 填充下行从右到左
- 填充左列从下到上
循环圈数判断 n/2为循环的圈数,n奇偶数要做不同的判断
螺旋矩阵大致分为两种 一种为填充螺旋矩阵 一种为以螺旋矩阵中读出数据 都要对奇偶数做特殊处理如果填充螺旋矩阵则为奇数时最中间的数需要特殊处理,如果从螺旋矩阵中读数据时要注意行数与列数不一致的情况,循环圈数为行数与列数的最小值,最后处理多出来的行与列,如果行数大于列数则多出来列,如果列数大于行数则多出来行。
数组终结:
1.二分法 二分法时间复杂度:O(logn) 循环不变量原则
2.双指针法 通过一个快指针和慢指针在一个for循环下完成两个for循环的工作 双指针时间复杂度:O(n)
3.滑动窗口:滑动窗口时间复杂度:O(n) 滑动窗口的精妙之处在于根据当前子序列和大小的情况,不断调节子序列的起始位置。从而将O(n^2)的暴力解法降为O(n)。
4.模拟行为:循环不变量原则