首页 > 编程语言 >LeetCode从算法到算命—1749.任意子数组和的绝对值的最大值

LeetCode从算法到算命—1749.任意子数组和的绝对值的最大值

时间:2023-08-09 19:55:26浏览次数:45  
标签:return nums int 任意子 abs 1749 数组 LeetCode 绝对值

1749.任意子数组和的绝对值的最大值

题目信息

给你一个整数数组 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

示例 1:

输入:nums = [1,-3,2,3,-4]
输出:5
解释:子数组 [2,3] 和的绝对值最大,为 abs(2+3) = abs(5) = 5 。

示例 2:

输入:nums = [2,-5,1,-4,3,-2]
输出:8
解释:子数组 [-5,1,-4] 和的绝对值最大,为 abs(-5+1-4) = abs(-8) = 8 。

提示:

  • 1 <= nums.length <= 105
  • -104 <= nums[i] <= 104

解题思路

这道题使用了动态规划的思想,通过递归和记忆化数组的方式来求解最大绝对和。对于每个位置,通过比较当前元素与前一个位置的最大/最小值之和的方式,来确定在该位置的最大/最小值。最终返回最大绝对和,即最大正数和最小负数之间的较大值。

因为加上了绝对值,除了求最大和之外,还有一种可能是来自最小子数组的和。最后比较两个结果,取最大返回就是结果。

Java代码

public class Solution {
    int[] nums,memMax,memMin;
    public int maxAbsoluteSum(int[] nums) {
        this.nums = nums;
        int n = nums.length;
        //算最大和,初始化为最小
        memMax = new int[n];
        Arrays.fill(memMax,Integer.MIN_VALUE / 2);
        int mx = Integer.MIN_VALUE / 2;
        for (int i = 0 ; i < n; i++) {
            mx = Math.max(mx,Max(i));
        }

        //算最小和,初始化为最大
        memMin = new int[n];
        Arrays.fill(memMin,Integer.MIN_VALUE / 2);
        int mn = Integer.MIN_VALUE / 2;
        for (int i = 0 ; i < n; i++) {
            mn = Math.min(mn,Min(i));
        }
        //返回较大的结果。如果mn为正,那一定没有mx大,因为mx是最大和。如果mn为负,那么加上负号就会变为正数,达到绝对值的效果
        return Math.max(mx,-mn);
    }

    //两个DFS
    //求最大和
    int Max(int i) {
        //首先判断 i 是否小于 0,如果是则返回 0。
        if (i < 0 ){
            return 0;
        }
        if (memMax[i] != Integer.MIN_VALUE / 2 ) {
            return memMax[i];
        }
        int ans = Max(i - 1);
        //如果以i-1结尾的最大的子数组的和为负数,就选择本身。因为如果为负数,加上之后最大和一定会比之前小、就不是最大和了。
        return  memMax[i] = Math.max(nums[i], nums[i] + (ans > 0 ? ans : 0));
    }

    //求最小和,可能比最大值要大
    int Min(int i) {
        if (i < 0) {
            return 0;
        }
        if (memMin[i] != Integer.MIN_VALUE / 2) {
            return memMin[i];
        }
        int ans = Min(i - 1);
        //同理,如果小于零,对结果有贡献,就记录,否则就不记录
        return memMin[i] = Math.min(nums[i], nums[i] + (ans < 0 ? ans : 0));
    }
}

标签:return,nums,int,任意子,abs,1749,数组,LeetCode,绝对值
From: https://www.cnblogs.com/dem-pethidine/p/17617873.html

相关文章

  • 使用golang解决LeetCode热题Hot100(1-10)
    使用golang解决LeetCode热题Hot1001.两数之和https://leetcode.cn/problems/two-sum/题目给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个......
  • Leetcode刷题记录本
    Leetcode刷题记录本ID:1点击查看代码暴力破解法classSolution(object):deftwoSum(self,nums,target):""":typenums:List[int]:typetarget:int:rtype:List[int]""" #暴力破解法fori......
  • leetcode:下一个排列
     classSolution{public:voidnextPermutation(vector<int>&nums){intn=nums.size();inti=n-2;while(i>=0&&nums[i]>=nums[i+1]){//从后向前,找到第一个降序的,一直升序说明最大i--;}if(i<0......
  • LeetCode -- 127. 单词接龙
     方法一:双向广搜classSolution{public:intladderLength(stringbeginWord,stringendWord,vector<string>&wordList){set<string>se;for(autoit:wordList){se.insert(it);}if(!se.count(en......
  • LeetCode 热题 100 之 240. 搜索二维矩阵 II
    题目编写一个高效的算法来搜索mxn矩阵matrix中的一个目标值target。该矩阵具有以下特性:每行的元素从左到右升序排列。每列的元素从上到下升序排列。示例一输入:matrix=[[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]],target=5......
  • LeetCode 16. 3Sum Closest 双指针+排序
    Givenanintegerarraynumsoflengthnandanintegertarget,findthreeintegersinnumssuchthatthesumisclosesttotarget.Returnthesumofthethreeintegers.Youmayassumethateachinputwouldhaveexactlyonesolution.Solution先将原数组排序,然......
  • #yyds干货盘点# LeetCode程序员面试金典:水壶问题
    1.简述:有两个水壶,容量分别为 jug1Capacity 和jug2Capacity升。水的供应是无限的。确定是否有可能使用这两个壶准确得到 targetCapacity升。如果可以得到 targetCapacity 升水,最后请用以上水壶中的一或两个来盛放取得的 targetCapacity 升水。你可以:装满任意一个水壶清空......
  • LeetCode 周赛上分之旅 #38 结合排序不等式的动态规划
    ⭐️本文已收录到AndroidFamily,技术和职场问题,请关注公众号[彭旭锐]和BaguTreePro知识星球提问。学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越抽象,它能覆盖的问题域就越广,理解难度也更复杂。在这个专栏里,小彭与你分享每场LeetCode周赛的解题报告,一......
  • LeetCode 周赛上分之旅 # 37 多源 BFS 与连通性问题
    ⭐️本文已收录到AndroidFamily,技术和职场问题,请关注公众号[彭旭锐]和BaguTreePro知识星球提问。学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越抽象,它能覆盖的问题域就越广,理解难度也更复杂。在这个专栏里,小彭与你分享每场LeetCode周赛的解题报告,一......
  • #yyds干货盘点# LeetCode程序员面试金典:矩形区域不超过 K 的最大数值和
    1.简述:给你一个mxn的矩阵matrix和一个整数k,找出并返回矩阵内部矩形区域的不超过k的最大数值和。题目数据保证总会存在一个数值和不超过k的矩形区域。 示例1:输入:matrix=[[1,0,1],[0,-2,3]],k=2输出:2解释:蓝色边框圈出来的矩形区域 [[0,1],[-2,3]] 的数值和是......