# LeetCode算法学习之- 滑动窗口-[1695. 删除子数组的最大得分]

287 阅读1分钟

题目

给你一个正整数数组 nums ,请你从中删除一个含有 若干不同元素 的子数组。删除子数组的 得分 就是子数组各元素之 和 。

返回 只删除一个 子数组可获得的 最大得分 。

如果数组 b 是数组 a 的一个连续子序列,即如果它等于 a[l],a[l+1],...,a[r] ,那么它就是 a 的一个子数组。

分析

\1. 子数组 =》 动态滑动窗口 => 满足条件 left++

\2. 最大得分=》 max 不停更新

\3. 包含不同元素=》 map

解法:滑动窗口


思路
1. 最大得分就是 实际就是 子数组的最大和
2. 因为是不同元素 所以 使用map 来收集元素的集合
3. 子数组所以采用 动态滑动窗口,不满足条件的时候就左边收敛区间范围
*/

// @lc code=start
/**
 * @param {number[]} nums
 * @return {number}
 */
var maximumUniqueSubarray = function (nums) {
    // 初始化条件
  let sum = 0;
  const map = new Map();
  let j = 0;
  let max = 0;

//  右指针不停移动
  for (let i = 0; i < nums.length; i++) {
    // 右指针的值不断放入map中  
    const rs = nums[i];
    map[rs] = (map[rs] || 0) + 1;
    sum += rs;
    // 如果有值超过1 则表示含有不同的值 则需要收缩左指针
    while (map[rs] > 1 && j <= i) {
      const ls = nums[j];
      map[ls] = map[ls] - 1;
      j++;
      sum -= ls;
    }
    // 不断更新max 
    max = Math.max(max, sum);
  }

  return max;
};

//时间复杂度:O(n)不同元素的个数为m
//空间复杂度:O(m) 
// @lc code=end


总结

今天这道题是主要是练习如何使用动态的滑动窗口 来求最大连续子字符串的题目

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

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

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

\