Time: 20190908
Type: Meidum

题目描述

给你一个整数数组,返回它的某个 非空 子数组(连续元素)在执行一次可选的删除操作后,所能得到的最大元素总和。

换句话说,你可以从原数组中选出一个子数组,并可以决定要不要从中删除一个元素(只能删一次哦),(删除后)子数组中至少应当有一个元素,然后该子数组(剩下)的元素总和是所有子数组之中最大的。

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

请看示例:

示例 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。

思路

至多可以删除一个元素,对于这个条件我们可以使用两个数组来解决,前向数组和后向数组。这些数组会存储当前的最大子数组的和,从开始到第i个和从i到结尾。

写两个循环,第一个存储在前向数组中的当前最大和,另一个循环存储后向数组中的当前最大和。

然后再写个循环,得出忽略第i个元素的最大值。

代码

class Solution:def maximumSum(self, arr: List[int]) -> int:def maxSumSubarrayRemovingOneEle(arr, n): # 前向数组记录前向最大和fw = [0 for k in range(n)] # 后向数组计算后向最大和bw = [0 for k in range(n)] cur_max, max_so_far = arr[0], arr[0] fw[0] = arr[0]for i in range(1, n): cur_max = max(arr[i], cur_max + arr[i]) max_so_far = max(max_so_far, cur_max) fw[i] = cur_max cur_max, max_so_far = arr[n-1], arr[n-1]bw[n-1] = arr[n-1]  for i in range(n-2, -1, -1):cur_max = max(arr[i], cur_max + arr[i]) max_so_far = max(max_so_far, cur_max) bw[i] = cur_max fans = max_so_far # 此时fans表示的是不删除任何元素的结果#  选择忽略第i个元素的最大值for i in range(1,n-1): fans = max(fans, fw[i - 1] + bw[i + 1]) return fansn = len(arr)res = maxSumSubarrayRemovingOneEle(arr, n)# print(res)return res

END.

Leetcode 5182.删除一次得到子数组最大和相关推荐

  1. LeetCode 1186. 删除一次得到子数组最大和(DP)

    1. 题目 给你一个整数数组,返回它的某个 非空 子数组(连续元素)在执行一次可选的删除操作后,所能得到的最大元素总和. 换句话说,你可以从原数组中选出一个子数组,并可以决定要不要从中删除一个元素(只 ...

  2. leetcode算法题--删除一次得到子数组最大和★

    原题链接:https://leetcode-cn.com/problems/maximum-subarray-sum-with-one-deletion/ 1.穷举(超时) dp[i][j]表示arr ...

  3. LeetCode 930. 和相同的二元子数组(哈希+前缀和)

    文章目录 1. 题目 2. 解题 1. 题目 在由若干 0 和 1 组成的数组 A 中,有多少个和为 S 的非空子数组. 示例: 输入:A = [1,0,1,0,1], S = 2 输出:4 解释: ...

  4. php取数组中连续数,PHP实现求连续子数组最大和问题2种解决方法

    本文实例讲述了PHP实现求连续子数组最大和问题2种解决方法.分享给大家供大家参考,具体如下: 问题描述 求子数组的最大和 题目描述: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整 ...

  5. LeetCode简单题之通过翻转子数组使两个数组相等

    题目 给你两个长度相同的整数数组 target 和 arr . 每一步中,你可以选择 arr 的任意 非空子数组 并将它翻转.你可以执行此过程任意次. 如果你能让 arr 变得与 target 相同, ...

  6. LeetCode 2090. 半径为 k 的子数组平均值(滑窗)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个下标从 0 开始的数组 nums ,数组中有 n 个整数,另给你一个整数 k . 半径为 k 的子数组平均值 是指:nums 中一个以下标 i 为 ...

  7. LeetCode 1031. 两个非重叠子数组的最大和(一次遍历,要复习)*

    文章目录 1. 题目 2. 解题 2.1 暴力枚举 2.2 一次遍历 1. 题目 给出非负整数数组 A ,返回两个非重叠(连续)子数组中元素的最大和,子数组的长度分别为 L 和 M.(这里需要澄清的是 ...

  8. LeetCode 713. 乘积小于K的子数组(滑动窗口)

    1. 题目 给定一个正整数数组 nums. 找出该数组内乘积小于 k 的连续的子数组的个数. 示例 1: 输入: nums = [10,5,2,6], k = 100 输出: 8 解释: 8个乘积小于 ...

  9. LeetCode 560. 和为K的子数组(前缀和差分)

    1. 题目 给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数. 示例 1 : 输入:nums = [1,1,1], k = 2 输出: 2 , [1,1] 与 [1,1 ...

最新文章

  1. Windows10自带搜索增强设置
  2. H5地理定位获取用户当前位置、城市
  3. Python字符型验证码识别
  4. python中map函数字典映射_python Chainmap函数(19)
  5. debian9 没有ipv4
  6. VC,一条会被鼠标移动的直线
  7. Android之手机摇一摇震动刷新(支持ListView、GridView、WebView)并生成我的二维码
  8. windows API 串口编程参考
  9. 经典面试题(19):以下代码将输出的结果是什么?
  10. 虚拟机usb接口连接失败_适用于汽车的USB接口连接器介绍与设计(好文分享)
  11. git分支拉项目_Git 拉取 GitLab 分支上的项目
  12. 报表制作1(传入对象和其他参数)
  13. SaaS-HRM 需求分析
  14. PDF转换CAD有什么方法
  15. 怎样在电脑上下载哔哩哔哩的视频?
  16. Redis -- 缓存穿透和雪崩
  17. LeetCode:387.字符串中的第一个唯一字符
  18. 富士康计算机主板官网,富士康主板BIOS设置的进入方法
  19. 用ESP8266_RTOS_SDK v3的I2C控制电容传感器FDC2214
  20. Eclipse中安装Java反编译插件JD-Eclipse

热门文章

  1. 数据结构上机实践第八周项目4-字符串加密
  2. gnuplot 常用命令大全
  3. YOLO系列专题——YOLOv2理论篇
  4. Git使用方法(三)-小技巧篇
  5. html 盒子写法,CSS盒子模型
  6. 数字图像处理怎么讲yiq空间变成rgb空间_【JTRP】屏幕空间深度边缘光 Screen Space Depth Rimlight...
  7. unix linux 安装mono,关于mono在linux连接unixodbc的问题
  8. python安装whl_1 Matplotlib在win10下安装
  9. c#定时备份mysql数据库_C# 定时备份数据库工具源码下载
  10. C语言计算表达式咋写,C语言如何计算表达式(x++)+(++x)+(x++)