- 给你一个正整数数组 nums ,请你从中删除一个含有 若干不同元素 的子数组。删除子数组的 得分 就是子数组各元素之 和 。
返回 只删除一个 子数组可获得的 最大得分 。
如果数组 b 是数组 a 的一个连续子序列,即如果它等于 a[l],a[l+1],...,a[r] ,那么它就是 a 的一个子数组。
示例 1:
输入:nums = [4,2,4,5,6] 输出:17 解释:最优子数组是 [2,4,5,6] 示例 2:
输入:nums = [5,2,1,2,5,2,1,2,5] 输出:8 解释:最优子数组是 [5,2,1] 或 [1,2,5]
来源:力扣(LeetCode) 链接:leetcode.cn/problems/ma… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
/**
* @param {number[]} nums
* @return {number}
*/
var maximumUniqueSubarray = function(nums) {
// 时间超出限制不予通过
// let res = [],temp = [],n = 0
// for(let i = 0; i < nums.length; i++) {
// if(!temp.includes(nums[i])) {
// temp.push(nums[i])
// }else {
// res.push([...temp])
// temp = []
// n++
// i = n - 1
// }
// }
// temp.length > 0 ? res.push(temp): ''
// let newArr = res.map(i => arrCount(i)).sort((a,b) => a - b)
// return newArr.pop()
// 正解如下, 滑动窗口
let sum = 0
const map = new Map()
let j = 0
let max = 0
for (let i = 0; i < nums.length; i++) {
const rs = nums[i]
map[rs] = (map[rs] || 0) + 1
sum += rs
while(map[rs] > 1 && j <= i) {
const ls = nums[j]
map[ls] = map[ls] - 1
j++
sum -= ls
}
max = Math.max(max, sum)
}
return max
};
function arrCount (arr) {
let sum = 0
for(let i = 0; i < arr.length; i++) {
sum += arr[i]
}
return sum
}