滑动窗口解法总结

应用场景

满足什么条件(无重复,无覆盖等)的最长/最短子串/子数组/子序列 (连续)

思路

寻找最长

  • 核心:左右双指针在起始点,右指针向右逐位滑动。在滑动的过程中
    • 窗内元素满足条件,右指针向右扩大窗口,并更新最优结果
    • 窗内元素不满足条件,左指针向右缩小窗口
    • 直到右指针到达结尾
  • 模板

    1. // 初始化 left,right,result,bestResult
    2. while(right没有到结尾){
    3. 窗口扩大,加入right对应元素,更新当前的结果
    4. while(当前结果不满足要求){
    5. 窗口缩小,移除left对应元素,left++;
    6. }
    7. 更新最优结果
    8. right++;
    9. }
    10. return bestResult;

    寻找最短

  • 核心:左右双指针在起始点,右指针向右逐位滑动。在滑动的过程中

    • 窗内元素满足条件,左指针向右缩小窗口,并更新最优结果
    • 窗内元素不满足条件,右指针向右扩大窗口
    • 知道右指针到达结果
  • 模板
    1. // 初始化 left,right,result,bestResult
    2. while(right没有到结尾){
    3. 窗口扩大,加入right对应元素,更新当前的结果
    4. while(当前结果满足要求){
    5. 更新最优结果
    6. 窗口缩小,移除left对应元素,left++;
    7. }
    8. right++;
    9. }
    10. return bestResult;

滑动窗口算法

209. 长度最小的子数组

image.png

904. 水果成篮

image.png

76. 最小覆盖子串

image.png

类数组转数组

  1. function Person(){
  2. // 1
  3. const arr1 = [];
  4. for(let i = 0; i < arguments.length; i++){
  5. arr1.push(arguments[i]);
  6. }
  7. console.log(arr1)
  8. // 2
  9. let arr2 = Array.from(arguments);
  10. console.log(arr2)
  11. // 3
  12. let arr3 = Array.prototype.slice.call(arguments)
  13. let arr4 = [].slice.call(arguments);
  14. console.log(arr3)
  15. console.log(arr4)
  16. // 4
  17. let arr5 = [...arguments];
  18. console.log(arr5)
  19. }
  20. Person('1', '2', '3', '4')
  21. /**
  22. [ '1', '2', '3', '4' ]
  23. [ '1', '2', '3', '4' ]
  24. [ '1', '2', '3', '4' ]
  25. [ '1', '2', '3', '4' ]
  26. [ '1', '2', '3', '4' ]
  27. */

promise执行

第一题

  1. Promise.reject('err!!!')
  2. .then((res) => {
  3. console.log('success', res)
  4. }, (err) => {
  5. console.log('error', err)
  6. }).catch(err => {
  7. console.log('catch', err)
  8. })
  9. // 'error', err!!!!
  10. // then 和 catch 的优先级由顺序决定

截屏2022-06-14 22.57.51.png截屏2022-06-14 22.58.05.png
但catch执行之后 then还是继续执行

第二题

  1. Promise.resolve()
  2. .then(function success (res) {
  3. throw new Error('error!!!')
  4. }, function fail1 (err) {
  5. console.log('fail1', err)
  6. }).catch(function fail2 (err) {
  7. console.log('fail2', err)
  8. })
  9. // fail2', error!!!!

第三题

  1. Promise.resolve('1')
  2. .then(res => {
  3. console.log(res)
  4. })
  5. .finally(() => {
  6. console.log('finally')
  7. })
  8. Promise.resolve('2')
  9. .finally(() => {
  10. console.log('finally2')
  11. return '我是finally2返回的值'
  12. })
  13. .then(res => {
  14. console.log('finally2后面的then函数', res)
  15. })