【算法】Maximum Sum of Two Non-Overlapping Subarrays 两个非重叠子数组的最大和

这篇具有很好参考价值的文章主要介绍了【算法】Maximum Sum of Two Non-Overlapping Subarrays 两个非重叠子数组的最大和。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Maximum Sum of Two Non-Overlapping Subarrays 两个非重叠子数组的最大和

问题描述:

问题 有一个整数数组nums,和2个整数firstlen,secondlen,要求找出2个非重叠子数组中的元素的最大和,长度分别是firstlen,secondlen。
不限制2个子数组的先后顺序。
firstlen,secondlen的范围 [ 1 , 1000 ] [1,1000] [1,1000]
firstlen+secondlen的范围 [ 2 , 1000 ] [2,1000] [2,1000]
f i r s t l e n , s e c o n d l e n < = n u m s . l e n g t h < = 1000 firstlen,secondlen<=nums.length<=1000 firstlensecondlen<=nums.length<=1000,
单个元素范围 [ 0 , 1000 ] [0,1000] [0,1000]

分析

先不考虑数据范围的思考,使用暴力的方法来处理。

就是2个区间,假设是这2个区间和是 X,Y,根据题目的介绍一定存在这样的区间。但是无法确定的是2个位置,谁在前,谁在后。
所以2个情况都有可能,假设X前Y后,那么就需要确定X的位置,当X的位置确定后,那么X的右侧就是Y可能出现的位置,也就是说当X确定后,Y的取值决定与 [ X e n d + 1 , n − 1 ] [Xend+1,n-1] [Xend+1,n1],Y要在这个区间内找到最大的。这样才可能与 X + Y X+Y X+Y得到备选。

【先将nums进行前缀和预处理

使用暴力的方法,每一轮计算Y的最大值,时间复杂度为 O ( N ) O(N ) O(N),而枚举X的位置的次数也大概是ON,这样整体的时间复杂度就是 O ( N 2 ) O(N^2 ) O(N2),如果不使用前缀和,时间复杂度应该更高。
同样的 还要把Y前X后的计算一遍,整体来说,应该可以通过。

如果把问题再抽象一点,可以 利用滑动窗口,当窗口的右边界右扩展,假设X前Y后,Y的位置就是紧靠窗口的右边界,那么Y的值就可以 O ( 1 ) O(1 ) O(1)的时间复杂度计算,同时X的可用范围也在扩展,因为需要找到可用区间X的最大值,那么可以用前缀和,和DP记录目前X可以得到的最大值,时间复杂度 O ( 1 ) O(1 ) O(1)
窗口一直要滑到末尾,时间复杂度 O ( N ) O(N ) O(N)
同样的思路Y前X后,也走一次。整体的时间复杂度 O ( N ) O(N ) O(N),空间 O ( N ) O(N ) O(N)
如果还要优化,DP计算X最大值部分可以使用变量计算,空间 O ( 1 ) O(1 ) O(1)

代码

时间复杂度 O ( N ) O(N ) O(N),空间复杂度 O ( 1 ) O(1) O(1)

class Solution {
    public int maxSumTwoNoOverlap(int[] nums, int firstLen, int secondLen) {
        return Math.max(help(nums, firstLen, secondLen), help(nums, secondLen, firstLen));
    }

    public int help(int[] nums, int firstLen, int secondLen) {
        int suml = 0;
        for (int i = 0; i < firstLen; ++i) {
            suml += nums[i];
        }
        int maxSumL = suml;
        int sumr = 0;
        for (int i = firstLen; i < firstLen + secondLen; ++i) {
            sumr += nums[i];
        }
        int res = maxSumL + sumr;
        for (int i = firstLen + secondLen, j = firstLen; i < nums.length; ++i, ++j) {
            suml += nums[j] - nums[j - firstLen];
            maxSumL = Math.max(maxSumL, suml);
            sumr += nums[i] - nums[i - secondLen];
            res = Math.max(res, maxSumL + sumr);
        }
        return res;
    }
}
 
public int maxSumTwoNoOverlap(int[] nums, int firstLen, int secondLen) {
        int l = firstLen;
        int m = secondLen;
        int n = l+m;
        for (int i = 1; i < nums.length; i++) {
            nums[i] += nums[i - 1];
        }
        int res = nums[l + m - 1];
        int Lmax = nums[l - 1];
        int Mmax = nums[m - 1];
        for (int i = l + m; i < nums.length; i++) {
            Lmax = Math.max(Lmax, nums[i - m] - nums[i - n]);
            Mmax = Math.max(Mmax, nums[i - l] - nums[i - n]);
            res = Math.max(res, Math.max(Lmax + nums[i] - nums[i - m],
            Mmax + nums[i] - nums[i - l]));
        }
        return res;
    }

Tag

动态规划 滑动窗口文章来源地址https://www.toymoban.com/news/detail-426586.html

到了这里,关于【算法】Maximum Sum of Two Non-Overlapping Subarrays 两个非重叠子数组的最大和的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • LeetCode //C - 1161. Maximum Level Sum of a Binary Tree

    Given the root of a binary tree, the level of its root is 1, the level of its children is 2, and so on. Return the smallest level x such that the sum of all the values of nodes at level x is maximal.   Example 1: Input: root = [1,7,0,7,-8,null,null] Output: 2 **Explanation: ** Level 1 sum = 1. Level 2 sum = 7 + 0 = 7. Level 3 sum = 7 + -8 = -1. So we return

    2024年01月23日
    浏览(39)
  • 算法面试题:Two Sum问题

    问题: 查找数组中的两个数字,使它们的和等于给定的目标值。返回这两个数字的索引。你可以假设每个输入都只有一个解,而且你不能使用相同的元素两次。 示例: 解答: 这个问题是著名的Two Sum问题,它可以通过使用哈希表来解决,时间复杂度为O(n),其中n是数组的长度

    2024年02月07日
    浏览(31)
  • Leetcode 3007. Maximum Number That Sum of the Prices Is Less Than or Equal to K

    Leetcode 3007. Maximum Number That Sum of the Prices Is Less Than or Equal to K 1. 解题思路 2. 代码实现 题目链接:3007. Maximum Number That Sum of the Prices Is Less Than or Equal to K 这一题我的思路上就是一个二分的思路,先确定一个上下界,然后不断通过二分来找到最大的price不超过k的值。 因此,剩下的

    2024年01月20日
    浏览(33)
  • 【算法】Two Sum II - Input Array Is Sorted 两数之和 II - 输入有序数组

    给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] ,则 1 = index1 index2 = numbers.length 。 以长度为 2 的整数数组 [index1, index2] 的形式返回这两个

    2024年02月13日
    浏览(37)
  • 深度学习基本功3:NMS(Non-Maximum Suppression,非极大值抑制)算法原理及实现

    大多数目标检测算法(稠密预测)在得到最终的预测结果时,特征图的每个位置都会输出多个检测结果,整个特征图上会出很多个重叠的框。例如要检测一辆车,可能会有多个bbox都把这辆车给框了出来,因此需要从这些bbox中选出框得最好的,删除掉其它的。要定义框得好与

    2024年02月06日
    浏览(34)
  • 【算法】Maximum Tastiness of Candy Basket 礼盒的最大甜蜜度

    给你一个正整数数组 price ,其中 price[i] 表示第 i 类糖果的价格,另给你一个正整数 k 。 商店组合 k 类 不同 糖果打包成礼盒出售。礼盒的 甜蜜度 是礼盒中任意两种糖果 价格 绝对差的最小值。 返回礼盒的 最大 甜蜜度。 price.length 范围 [ 1 , 1 0 5 ] [1,10^5] [ 1 , 1 0 5 ] , price[i] 范

    2024年02月07日
    浏览(30)
  • LeetCode 1. Two Sum 两数之和

    题目描述 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。 示例: 给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2

    2023年04月25日
    浏览(30)
  • PAT 甲级【1007 Maximum Subsequence Sum】

    本题是考察动态规划与java的快速输入: max[i]表示第i个结尾的最大的连续子串和。b begin[i]表示第[begin[i],i]为最大和的开始位置 超时代码: 未超时: 能用动态规划解决的问题,需要满足三个条件:最优子结构,无后效性和子问题重叠。 具有最优子结构也可能是适合用贪心的

    2024年02月08日
    浏览(31)
  • 01-复杂度2 Maximum Subsequence Sum

    比上一题(01-复杂度1 最大子列和问题),要多记录几个内容 首尾元素,当前子序列开头元素,当前子序列结尾元素,最佳子序列开头元素,current是否在此处清零(则下一个元素是开头元素) 时间复杂度 O(n) 空间复杂度 O(1)

    2024年02月16日
    浏览(25)
  • LeetCode //C - 918. Maximum Sum Circular Subarray

    Given a circular integer array nums of length n, return the maximum possible sum of a non-empty subarray of nums. A circular array means the end of the array connects to the beginning of the array. Formally, the next element of nums[i] is nums[(i + 1) % n] and the previous element of nums[i] is nums[(i - 1 + n) % n]. A subarray may only include each element

    2024年02月07日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包