力扣刷题日记-1695-删除子数组的最大得分

76 阅读1分钟
  • 给你一个正整数数组 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
}