3487. 删除后的最大子数组元素和

题目链接

3487. 删除后的最大子数组元素和 - 力扣(LeetCode)

题目描述

给你一个整数数组 nums 。

你可以从数组 nums 中删除任意数量的元素,但不能将其变为 空 数组。执行删除操作后,选出 nums 中满足下述条件的一个子数组:

  1. 子数组中的所有元素 互不相同 。
  2. 最大化 子数组的元素和。

返回子数组的 最大元素和 。

子数组 是数组的一个连续、非空 的元素序列。

题目示例

示例 1 :

java 复制代码
输入:nums = [1,2,3,4,5]
输出:15
解释:
不删除任何元素,选中整个数组得到最大元素和。

示例 2 :

java 复制代码
输入:nums = [1,1,0,1,1]
输出:1
解释:
删除元素 nums[0] == 1、nums[1] == 1、nums[2] == 0 和 nums[3] == 1 。选中整个数组 [1] 得到最大元素和。

解题思路

  1. 问题理解:题目要求计算数组中所有不重复的非负数的和。如果数组中全是负数,则返回最大的负数。
  2. 核心思路 :
    • 使用一个HashSet来记录已经处理过的非负数,确保每个非负数只被累加一次。
    • 遍历数组,对每个元素进行分类处理:
      • 如果是负数,更新当前最大的负数。
      • 如果是非负数且未被处理过(即set.add(x)返回true),则将其累加到sum中。
    • 最后检查set是否为空:
      • 如果为空,说明数组中没有非负数,返回最大的负数。
      • 否则,返回非负数的累加和。
  3. 关键点 :
    • 利用HashSet的去重特性确保非负数只被累加一次。
    • 通过mx变量动态维护最大的负数,以处理全为负数的情况。

题解代码

java 复制代码
class Solution {
    public int maxSum(int[] nums) {
        // 使用HashSet来记录已经处理过的非负数
        Set<Integer> set = new HashSet<>();
        // sum用于累加所有不重复的非负数
        int sum = 0;
        // mx用于记录最大的负数(如果所有数都是负数时使用)
        int mx = Integer.MIN_VALUE;
        
        // 遍历数组中的每个元素
        for(int x : nums){
            if(x < 0){
                // 如果是负数,更新最大的负数
                mx = Math.max(mx, x);
            } else if (set.add(x)){
                // 如果是非负数且未被处理过(set.add(x)返回true表示成功添加)
                // 则将其加入sum
                sum += x;
            }
        }
        // 如果set为空(说明所有数都是负数),返回最大的负数
        // 否则返回非负数的和
        return set.isEmpty() ? mx : sum;
    }
}

复杂度分析

  1. 时间复杂度 :
    • 遍历数组的时间复杂度为O(n),其中n是数组的长度。
    • HashSet的插入操作set.add(x)的平均时间复杂度为O(1)。
    • 因此,总的时间复杂度为O(n)。
  2. 空间复杂度 :
    • HashSet在最坏情况下需要存储所有非负数,因此空间复杂度为O(n)(例如所有数都是非负数且不重复时)。
    • 其他变量(如sum、mx)占用常数空间,可以忽略。
相关推荐
yi0116 小时前
LeetCode 219:存在重复元素 II——哈希表记录“最近一次出现的位置”
数据结构·人工智能·笔记·python·算法·leetcode·哈希表
灯澜忆梦8 小时前
【面向对象编程C++】| 基础语法
java·c++·算法
小蒋观天下8 小时前
专项方案:大场景港口AI安防、多干扰环境下的算法调优与落地实操
人工智能·深度学习·算法·安全·机器学习·计算机视觉·ai大模型
Evand J8 小时前
【电机滤波例程5】渐消因子自适应扩展卡尔曼滤波(EKF),MATLAB。PMSM负载突变下的状态估计。附下载链接
算法·matlab
H.莓飛9 小时前
【数据结构】二叉树_OJ题
linux·开发语言·数据结构·算法
好想像大佬一样能够ak所有9 小时前
Leetcode35.搜索插入位置
数据结构·算法·leetcode
aqiu1111119 小时前
【C++算法打怪专栏】LeetCode 165. 比较版本号(双指针与字符串流法)
c++·算法·leetcode
黄金龙PLUS10 小时前
如何基于置换算法来设计对称加密算法
算法·网络安全·密码学·哈希算法·同态加密
不会就选b10 小时前
算法日常・每日刷题--<动态规划>14
算法
赛博守夜人10 小时前
跨境业务与出海合规之九:海外买量投放与营销虚假流量(Ad Fraud):跨国机房群控与归因欺诈识别算法
算法·安全