# LeetCode算法学习之- 滑动窗口-[1052. 爱生气的书店老板]

136 阅读1分钟

题目

有一个书店老板,他的书店开了 n 分钟。每分钟都有一些顾客进入这家商店。给定一个长度为 n 的整数数组 customers ,其中 customers[i] 是在第 i 分钟开始时进入商店的顾客数量,所有这些顾客在第 i 分钟结束后离开。

在某些时候,书店老板会生气。 如果书店老板在第 i 分钟生气,那么 grumpy[i] = 1,否则 grumpy[i] = 0。

当书店老板生气时,那一分钟的顾客就会不满意,若老板不生气则顾客是满意的。

书店老板知道一个秘密技巧,能抑制自己的情绪,可以让自己连续 minutes 分钟不生气,但却只能使用一次。

请你返回 这一天营业下来,最多有多少客户能够感到满意 。

分析

  1. 因为要求最大满意读 所有采用 max不断更新
  2. 因为是连续的Minutes 所有考虑使用固定滑动窗口

解法:滑动窗口


/*
 * @lc app=leetcode.cn id=1052 lang=javascript
 *
 * [1052] 爱生气的书店老板
 */
/* 
已知
1.数组 customers =》 for loop or sum+=cusomters[i]
2.数组 grumpy =》 for loop 
3.minutes = 3 =》 i+3 
未知
这一天营业下来,最多有多少客户能够感到满意= > 已知 2个数组 一个正数=》 求 最大值
条件

n == customers.length == grumpy.length =》 无
1 <= minutes <= n <= 2 * 104 =》 无
0 <= customers[i] <= 1000=》无
grumpy[i] == 0 or 1=》 无
相同未知量
1.固定窗口 =》 
相似题目
回顾
思想
1. 连续分钟内的最大顾客数 =》 可以考虑固定滑动窗口
2. 因为是所有顾客的满意度 =》 所有可以使用sum来统计
3. 因为需要求最大顾客满意度=》所有可以不断的更新max
*/
// @lc code=start
/**
 * @param {number[]} customers
 * @param {number[]} grumpy
 * @param {number} minutes
 * @return {number}
 */
var maxSatisfied = function (customers, grumpy, minutes) {
    
  let sum = 0;
//   左指针
  let j = 0;
  let max = 0;
//   计算出当前minutes 不生气的时候的 最大满意度
  for (let index = 0; index < customers.length; index++) {
    if (index < minutes) {
      sum += customers[index];
    } else {
      sum += grumpy[index] === 0 ? customers[index] : 0;
    }
  }
  max = sum;
//   然后在不断的移动 固定的滑动窗口 j指针和i 指针
  for (let i = minutes; i < customers.length; i++) {
    //   如果grumpy[j] 为不生气表示本来就要加 所有不用减去
    sum -= grumpy[j] === 0 ? 0 : customers[j];
    j++;
    sum += grumpy[i] === 0 ? 0 : customers[i];
    // 不断迭代max
    max = Math.max(sum, max);
  }

  return max;
};
//时间复杂度:O(n)
//空间复杂度:O(1)
// @lc code=end

总结

今天这道题是主要是练习如何使用 固定尺寸的滑动窗口 来求最大的值的题目

大家可以看看我分享的一个专栏(前端搞算法)里面有更多关于算法的题目的分享,希望能够帮到大家,我会尽量保持每天晚上更新,如果喜欢的麻烦帮我点个赞,十分感谢

大家如果对“TS”感兴趣的可以看看我的专栏 (TypeScript常用知识),感谢大家的支持

文章内容目的在于学习讨论与分享学习算法过程中的心得体会,文中部分素材来源网络,如有侵权,请联系删除,邮箱 182450609@qq.com

\