力扣---数组篇之滑动窗口
一、注意事项
- 求数组的子数组时可以利用
滑动窗口
进行处理 滑动窗口
:不断调节子序列的起始位置和终止位置,从而得出想要的结果- 在利用滑动窗口实现时一定要弄清楚:首先窗口内是什么;其次如何移动窗口的起始位置;最后如何移动窗口的结束位置
- 窗口就是题目所要求的条件
二、刷题
1. 209_长度最小的子数组
- 方法一:滑动窗口法【本题中利用了
Number 对象
中的属性 MAX_VALUE
】var minSubArrayLen = function(target, nums) { var l = 0; //滑动窗口的起始位置 var sum = 0; var subLen = 0; //滑动窗口的长度 var result = Number.MAX_VALUE; for (var r = 0; r < nums.length; r++) { sum += nums[r]; while(sum >= target) { subLen = r - l + 1; result = result < subLen ? result : subLen; sum -= nums[l++]; } } return result !== Number.MAX_VALUE ? result : 0; };
- 方法二:暴力解法【双重 for 循环,外层循环控制起始位置,内层循环控制当前起始位置满足条件的终点位置】
var minSubArrayLen = function(target, nums) { var subLen = 0; var result = Number.MAX_VALUE; for (var i = 0; i < nums.length; i++) { var sum = 0; for (var j = i; j < nums.length; j++) { sum += nums[j]; if (sum >= target) { subLen = j - i + 1; result = result < subLen ? result : subLen; break; } } } return result === Number.MAX_VALUE ? 0 : result; };
2. 904_水果成篮
- 方法一:滑动窗口【利用
temp
指向 篮子2 装的第一个果子,这样可以方便 篮子1 要变化时可以靠temp
进行更改】var totalFruit = function(fruits) { if (fruits.length < 3) { return fruits.length; } var l1 = l2 = temp = 0; var result = Number.MIN_VALUE; for (var i = 1; i < fruits.length; i++) { if (fruits[i] != fruits[l1] && fruits[i] != fruits[l2]) { if (fruits[l1] != fruits[l2]) { l1 = temp; } l2 = i; } result = Math.max(result, i - l1 + 1); if (fruits[temp] != fruits[i]) { temp = i; } } return result; };
《代码随想录》还有第76题最小覆盖字串也是滑动窗口的推荐题目,但是好难呀我还需要再理解理解然后解决这道题~
总结
每天学习一点点,快乐就会多一点
以上就是今天 数组篇之滑动窗口 刷题记,小梁加油哦!!!