【每日一题Day289】LC1749任意子数组和的绝对值的最大值 | dp

简介: 【每日一题Day289】LC1749任意子数组和的绝对值的最大值 | dp

任意子数组和的绝对值的最大值【LC1749】

给你一个整数数组 nums 。一个子数组 [numsl, numsl+1, ..., numsr-1, numsr]和的绝对值abs(numsl + numsl+1 + ... + numsr-1 + numsr)

请你找出 nums和的绝对值 最大的任意子数组(可能为空),并返回该 最大值

abs(x) 定义如下:

  • 如果 x 是负整数,那么 abs(x) = -x
  • 如果 x 是非负整数,那么 abs(x) = x

和这两题很像,都是通过前面两种不同的状态转移过来的,删除一次得到子数组最大和&访问数组中的位置使分数最大

  • 思路:dp
  • 由于所求为子数组和的绝对值,某个子数组和nums[0,i-1]可能为负数或者正数,如果
  • nums[i]与前一子数组的正负值相同,那么取绝对值后的结果将增大。因此需要记录以nums[i]结尾的最小负数和以及最大正数和

image.png

class Solution {
    public int maxAbsoluteSum(int[] nums) {
        int res = 0, neg = 0, pos = 0;
        int n = nums.length;
        for (int i = 0; i < n; i++){            
            neg = Math.min(0, neg + nums[i]);// 以nums[i]结尾的和为负数的子数组和
            pos = Math.max(0, pos + nums[i]);// 以nums[i]结尾的和为正数的子数组和
            res = Math.max(res, Math.max(-neg, pos));
        }
        return res;
    }
}

image.png

目录
相关文章
|
6月前
【每日一题Day202】LC1015可被 K 整除的最小整数 | 模运算
【每日一题Day202】LC1015可被 K 整除的最小整数 | 模运算
66 2
|
6月前
|
索引
【每日一题Day183】LC1187使数组严格递增 | dp
【每日一题Day183】LC1187使数组严格递增 | dp
42 0
|
6月前
【每日一题Day185】LC1027最长等差数列 | dp
【每日一题Day185】LC1027最长等差数列 | dp
44 0
|
6月前
【每日一题Day357】LC1155掷骰子等于目标和的方法数 | dp
【每日一题Day357】LC1155掷骰子等于目标和的方法数 | dp
56 0
|
算法
【代码随想录】LC 209. 长度最小的子数组
利用两层循环,第一层循环枚举子数组的起点位置,第二层循环枚举子数组的终点位置,第二层循环中可以同时来统计当前子数组的和,如果符合题目条件则更新length,否则继续循环,直至两层循环结束,返回题目要求的值,算法结束。
58 0
|
6月前
【每日一题Day204】LC1330翻转子数组得到最大的数组值 | 数学
【每日一题Day204】LC1330翻转子数组得到最大的数组值 | 数学
44 1
|
6月前
【每日一题Day358】LC2698求一个整数的惩罚数 | 递归
【每日一题Day358】LC2698求一个整数的惩罚数 | 递归
52 0
|
C++
acwing 716. 最大数和它的位置 int的最大值和最小值
acwing 716. 最大数和它的位置 int的最大值和最小值
91 0
每日一题——长度最小的子数组
每日一题——长度最小的子数组
|
机器学习/深度学习 存储 算法
【每日一题Day78】LC1803统计异或值在范围内的数对有多少 | 字典树+容斥原理
不过如果在工程中,不考虑前缀匹配的话,基本上使用 hash 就能满足。如果考虑前缀匹配的话,工程也不会使用 Trie 。一方面是字符集大小不好确定,另外,对于个别的超长字符 Trie 会进一步变深。
87 0
【每日一题Day78】LC1803统计异或值在范围内的数对有多少 | 字典树+容斥原理