【LeetCode刷题-滑动窗口】--1695.删除子数组的最大得分

1695.删除子数组的最大得分

注意:子数组为不同元素

方法:滑动窗口

使用变长滑动窗口寻找数组nums中的以每个下标作为结束下标的元素各不相同的最长子数组。用[start,end]表示滑动窗口,初始时start=end=0,将滑动窗口的右端点end向右移动,移动过程中维护滑动窗口的左端点start,对于每个end寻找元素各不相同的最大滑动窗口

判断滑动窗口中是否有重复元素,需要使用哈希集合存储滑动窗口中出现的元素,用sum表示滑动窗口中的元素和。对于每个右端点end,将右端点处的元素记为num = nums[end],执行如下操作:

  • 将sum的值增加为num
  • 如果哈希集合中有元素num,则滑动窗口[start,end]中有两个元素num,因此将sum的值减去nums[start],从哈希集中中移除元素nums[start],然后将start向右移动一位,重复该操作直到哈希集合中没有元素num
  • 当前滑动窗口[start,end]中的子数组为以end作为结束下标的元素各不相同的最长子数组,其元素和为sum,使用sum更新最大得分
java 复制代码
class Solution {
    public int maximumUniqueSubarray(int[] nums) {
        Set<Integer> set = new HashSet<Integer>();
        int maxSum = 0,sum = 0,start = 0,end = 0,len = nums.length;
        while(end < len){
            int num = nums[end];
            sum += num;
            while(set.contains(num)){
                sum -= nums[start];
                set.remove(nums[start]);
                start++;
            }
            set.add(num);
            maxSum = Math.max(maxSum,sum);
            end++;
        }
        return maxSum;
    }
}
相关推荐
David猪大卫14 分钟前
数据结构修炼——顺序表和链表的区别与联系
c语言·数据结构·学习·算法·leetcode·链表·蓝桥杯
Iceberg_wWzZ16 分钟前
数据结构(Day14)
linux·c语言·数据结构·算法
夏天天天天天天天#21 分钟前
求Huffman树及其matlab程序详解
算法·matlab·图论
Infedium29 分钟前
优数:助力更高效的边缘计算
算法·业界资讯
student.J1 小时前
傅里叶变换
python·算法·傅里叶
五味香1 小时前
C++学习,动态内存
java·c语言·开发语言·jvm·c++·学习·算法
Beauty.5681 小时前
P1328 [NOIP2014 提高组] 生活大爆炸版石头剪刀布
数据结构·c++·算法
Aurora20051 小时前
蓝桥杯2024省C
c语言·算法·蓝桥杯
爱棋笑谦1 小时前
二叉树计算
java·开发语言·数据结构·算法·华为od·面试
小鱼在乎1 小时前
动态规划---最长回文子序列
算法·动态规划