滑动窗口解法总结
应用场景
满足什么条件(无重复,无覆盖等)的最长/最短
的子串/子数组/子序列
(连续)
思路
寻找最长
- 核心:左右双指针在起始点,右指针向右逐位滑动。在滑动的过程中
- 窗内元素满足条件,右指针向右扩大窗口,并更新最优结果
- 窗内元素不满足条件,左指针向右缩小窗口
- 直到右指针到达结尾
模板
// 初始化 left,right,result,bestResult
while(right没有到结尾){
窗口扩大,加入right对应元素,更新当前的结果
while(当前结果不满足要求){
窗口缩小,移除left对应元素,left++;
}
更新最优结果
right++;
}
return bestResult;
寻找最短
核心:左右双指针在起始点,右指针向右逐位滑动。在滑动的过程中
- 窗内元素满足条件,左指针向右缩小窗口,并更新最优结果
- 窗内元素不满足条件,右指针向右扩大窗口
- 知道右指针到达结果
- 模板
// 初始化 left,right,result,bestResult
while(right没有到结尾){
窗口扩大,加入right对应元素,更新当前的结果
while(当前结果满足要求){
更新最优结果
窗口缩小,移除left对应元素,left++;
}
right++;
}
return bestResult;
滑动窗口算法
209. 长度最小的子数组
904. 水果成篮
76. 最小覆盖子串
类数组转数组
function Person(){
// 1
const arr1 = [];
for(let i = 0; i < arguments.length; i++){
arr1.push(arguments[i]);
}
console.log(arr1)
// 2
let arr2 = Array.from(arguments);
console.log(arr2)
// 3
let arr3 = Array.prototype.slice.call(arguments)
let arr4 = [].slice.call(arguments);
console.log(arr3)
console.log(arr4)
// 4
let arr5 = [...arguments];
console.log(arr5)
}
Person('1', '2', '3', '4')
/**
[ '1', '2', '3', '4' ]
[ '1', '2', '3', '4' ]
[ '1', '2', '3', '4' ]
[ '1', '2', '3', '4' ]
[ '1', '2', '3', '4' ]
*/
promise执行
第一题
Promise.reject('err!!!')
.then((res) => {
console.log('success', res)
}, (err) => {
console.log('error', err)
}).catch(err => {
console.log('catch', err)
})
// 'error', err!!!!
// then 和 catch 的优先级由顺序决定
但catch执行之后 then还是继续执行
第二题
Promise.resolve()
.then(function success (res) {
throw new Error('error!!!')
}, function fail1 (err) {
console.log('fail1', err)
}).catch(function fail2 (err) {
console.log('fail2', err)
})
// fail2', error!!!!
第三题
Promise.resolve('1')
.then(res => {
console.log(res)
})
.finally(() => {
console.log('finally')
})
Promise.resolve('2')
.finally(() => {
console.log('finally2')
return '我是finally2返回的值'
})
.then(res => {
console.log('finally2后面的then函数', res)
})