题目
给你一个正整数数组 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
\