【每日一题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

目录
相关文章
|
4天前
|
C++
两种解法解决LCR 008. 长度最小的子数组【C++】
两种解法解决LCR 008. 长度最小的子数组【C++】
|
4天前
【每日一题Day185】LC1027最长等差数列 | dp
【每日一题Day185】LC1027最长等差数列 | dp
23 0
|
4天前
|
索引
【每日一题Day183】LC1187使数组严格递增 | dp
【每日一题Day183】LC1187使数组严格递增 | dp
26 0
|
4天前
【每日一题Day202】LC1015可被 K 整除的最小整数 | 模运算
【每日一题Day202】LC1015可被 K 整除的最小整数 | 模运算
32 2
|
4天前
【每日一题Day357】LC1155掷骰子等于目标和的方法数 | dp
【每日一题Day357】LC1155掷骰子等于目标和的方法数 | dp
31 0
|
4天前
|
Java C++ Python
leetcode-209:长度最小的子数组
leetcode-209:长度最小的子数组
24 0
|
6月前
|
算法
【代码随想录】LC 209. 长度最小的子数组
利用两层循环,第一层循环枚举子数组的起点位置,第二层循环枚举子数组的终点位置,第二层循环中可以同时来统计当前子数组的和,如果符合题目条件则更新length,否则继续循环,直至两层循环结束,返回题目要求的值,算法结束。
34 0
|
8月前
P1125 [NOIP2008 提高组] 笨小猴(质数判断和快速排序找字符串最大值,最小值)
P1125 [NOIP2008 提高组] 笨小猴(质数判断和快速排序找字符串最大值,最小值)
37 0
|
11月前
每日一题——长度最小的子数组
每日一题——长度最小的子数组
每日一题:Leetcode209 长度最小的子数组
每日一题:Leetcode209 长度最小的子数组