博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LeetCode 1186 删除一次得到子数组最大和
阅读量:4142 次
发布时间:2019-05-25

本文共 986 字,大约阅读时间需要 3 分钟。

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

题目

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

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

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

示例 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 <= 10^5

-10^4 <= arr[i] <= 10^4

思路

设计两个数组,left和right,左数组统计从0到当前位置最大的和值,右数组统计从最后位置到当前位置的最大和值,然后用数组存left[i - 1] + right[i + 1]的值,找出最大值

代码

左数组统计从0到当前位置最大的和值

for(i = 1; i < arrSize; i++) {        left[i] = max(arr[i] + left[i - 1], arr[i]);    }

右数组统计从最后位置到当前位置的最大和值

for(j = arrSize - 2; j >= 0; j++) {        right[j] = max((arr[j] + right[j - 1], arr[j]);    }

用数组存left[i - 1] + right[i + 1]的值

dp[0] = max(left[0], right[-1]);    for(k = 1; k < arrSize - 1; k++) {        dp[k] = max((left[k] + right[k + 2], dp[k - 1]);    }

转载地址:http://twkti.baihongyu.com/

你可能感兴趣的文章
海量数据相似度计算之simhash和海明距离
查看>>
DeepLearning tutorial(5)CNN卷积神经网络应用于人脸识别(详细流程+代码实现)
查看>>
DeepLearning tutorial(6)易用的深度学习框架Keras简介
查看>>
DeepLearning tutorial(7)深度学习框架Keras的使用-进阶
查看>>
流形学习-高维数据的降维与可视化
查看>>
Python-OpenCV人脸检测(代码)
查看>>
python+opencv之视频人脸识别
查看>>
人脸识别(OpenCV+Python)
查看>>
6个强大的AngularJS扩展应用
查看>>
网站用户登录系统设计——jsGen实现版
查看>>
第三方SDK:讯飞语音听写
查看>>
第三方SDK:JPush SDK Eclipse
查看>>
第三方开源库:imageLoader的使用
查看>>
自定义控件:飞入飞出的效果
查看>>
自定义控件:动态获取控件的高
查看>>
第三方开源库:nineoldandroid:ValueAnimator 动态设置textview的高
查看>>
第三方SDK:百度地图SDK的使用
查看>>
Android studio_迁移Eclipse项目到Android studio
查看>>
JavaScript setTimeout() clearTimeout() 方法
查看>>
CSS border 属性及用border画各种图形
查看>>