首页 > 其他分享 >1186. 删除一次得到子数组最大和 Medium

1186. 删除一次得到子数组最大和 Medium

时间:2024-07-21 16:26:44浏览次数:17  
标签:arr Medium 最大 删除 1186 元素 数组 dp

给你一个整数数组,返回它的某个 非空 子数组(连续元素)在执行一次可选的删除操作后,所能得到的最大元素总和。换句话说,你可以从原数组中选出一个子数组,并可以决定要不要从中删除一个元素(只能删一次哦),(删除后)子数组中至少应当有一个元素,然后该子数组(剩下)的元素总和是所有子数组之中最大的。

注意,删除一个元素后,子数组 不能为空

示例 1:

输入:arr = [1,-2,0,3]
输出:4
解释:我们可以选出 [1, -2, 0, 3],然后删掉 -2,这样得到 [1, 0, 3],和最大。

示例 2:

输入:arr = [1,-2,-2,3]
输出:3
解释:我们直接选出 [3],这就是最大和。

示例 3:

输入:arr = [-1,-1,-1,-1]
输出:-1
解释:最后得到的子数组不能为空,所以我们不能选择 [-1] 并从中删去 -1 来得到 0。
     我们应该直接选择 [-1],或者选择 [-1, -1] 再从中删去一个 -1。

提示:

 ·1 <= arr.length <= 105

 ·-104 <= arr[i] <= 104

题目大意:计算最多删除1个元素后子数组中最大的元素和。

分析:

(1)设dp[i][0]表示以arr[i]结尾且不删除元素的非空子数组的最大和,dp[i][1]表示以arr[i]结尾且删除1个元素的非空子数组的最大和,由题可得dp[i][0]=max(dp[i-1][0],0)+arr[i],dp[i][1]=max(dp[i-1][0],dp[i-1][1]+arr[i]);

(2)由于dp[i][0]、dp[i][1]的值只与dp[i-1][0]、dp[i-1][1]的值相关,因此可对数组降维,用dp[0]维护以当前遍历的元素结尾且不删除元素的非空子数组的最大和,用dp[1]维护以当前遍历的元素结尾且删除1个元素的非空子数组的最大和。

class Solution {
public:
    int maximumSum(vector<int>& arr) {
        int N=arr.size(),dp0=arr[0],dp1=0,ans=dp0;
        for(int i=1;i<N;++i){
            dp1=max(dp1+arr[i],dp0);
            dp0=max(dp0,0)+arr[i];
            ans=max(ans,max(dp0,dp1));
        }
        return ans;
    }
};

标签:arr,Medium,最大,删除,1186,元素,数组,dp
From: https://blog.csdn.net/m0_60444839/article/details/140589646

相关文章

  • Leetcoede编程基础0到1——459.重复的子字符串 & 283.移动零 &1822.数组元素积的符号
    459.重复的子字符串给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。示例1:输入:s="abab"输出:true解释:可由子串"ab"重复两次构成。示例2:输入:s="aba"输出:false示例3:输入:s="abcabcabcabc"输出:true解释:可由子......
  • 第五章 数组
    1.一维数组1.1定义        在C语言中,一维数组的定义格式为:数据类型数组名[数组大小]。        例:定义一个包含5个整数的一维数组可以这样写:intnums[5];        "int"是数组中元素的数据类型,"nums"是数组的名称,"[5]"表示数组的大小为5,即数组......
  • Cython:将 2D 数组从 Python 传递到 C 并检索它
    我正在尝试使用Cython用C语言构建相机驱动程序的包装器。我是Cython的新手(两周前开始)。经过一番努力,我可以成功开发结构体、一维数组的包装器,但现在我陷入了二维数组的困境。相机的CAPI之一采用2D数组指针作为输入,并将捕获的图像分配给它。该函数需要从Python调......
  • 为何你还在坚持用数组?容器不比它香几条街?「上」
    以下内容为本人的烂笔头,如需要转载,请声明原文链接微信公众号「ENG八戒」https://mp.weixin.qq.com/s/tm2OKiLBQL2GBCd2ho6i5AC/C++到了寿终正寝的时候否?最近被热议的「美国白宫提倡软件开发者放弃使用C/C++这种语言再进行新的软件开发」。作为一名热衷于高性能架构开......
  • NumPy 广播数组是否会在二进制运算期间创建?
    我有两个numpy.ndarray具有不同形状的实例。如果我添加这两个数组,它们之间将发生广播:importnumpyasnpx=np.array([1,2,3])y=np.array([[2,3,5],[7,11,13]])print(x+y)#[[358]#[81316]]广播数组会被创建吗?也就......
  • 【软考】数据结构与算法基础 - 数组和链表
    一、数组和链表的区别(很简单,但是很常考,记得要回答全面)什么是数组:C++语言中,可以用数组,处理一组数据类型相同的数据,不可以动态定义数组的大小(使用前,必须指定大小。)在实际应用中,用户使用数组之前,无法确定数组的大小只能够将数组定义成足够大小,多余出来空间可能不被使用,......
  • 在感知器学习模型的 Python 实现中将数组传递给 numpy.dot()
    我正在尝试将单层感知器分类器的Python实现放在一起。我发现SebastianRaschka的《Python机器学习》一书中的示例非常有用,但我对他的实现的一小部分有疑问。这是代码:importnumpyasnpclassPerceptron(object):"""Perceptronclassifier.Parameters......
  • 塔子哥的最大数组-美团2023笔试(codefun2000)
    题目链接塔子哥的最大数组-美团2023笔试(codefun2000)题目内容塔子哥有一个长度为n的数组a,默认的求和方式是将a中所有元素加起来。但是塔子哥有一种技能,可以将求和的其中一次加法转换为乘法操作。在这种情况下,数组a的最大和为多少。输入描述第一行,一个正整......
  • 代码随想录数组二刷:长度最小的子数组(滑动窗口)
    代码随想录数组二刷:长度最小的子数组(滑动窗口)leetcode209这道题采用滑动窗口的思想去做。实现滑动窗口,主要确定如下三点:窗口内是什么?如何移动窗口的起始位置?如何移动窗口的结束位置?窗口就是满足其和≥s的长度最小的连续子数组。窗口的起始位置如何移动:如果当前窗口......
  • 2850. 将石头分散到网格图的最少移动次数 Medium
    给你一个大小为 3*3 ,下标从 0 开始的二维整数矩阵 grid ,分别表示每一个格子里石头的数目。网格图中总共恰好有 9 个石头,一个格子里可能会有 多个 石头。每一次操作中,你可以将一个石头从它当前所在格子移动到一个至少有一条公共边的相邻格子。请你返回每个格子恰......