LeetCode1031

力扣1031题

题目描述:两个非重叠了数组的最大和

给你一个整数数组 nums 和两个整数 firstLen 和 secondLen,请你找出并返回两个非重叠 子数组 中元素的最大和,长度分别为 firstLen 和 secondLen 。

长度为 firstLen 的子数组可以出现在长为 secondLen 的子数组之前或之后,但二者必须是不重叠的。

子数组是数组的一个 连续 部分。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/maximum-sum-of-two-non-overlapping-subarrays
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

image.png

题解思路:

  1. 借助一个求和数组s[n+1],长为原数组+1,s[i]表示nums的前(i+1)个元素的和;s[6]表示nums中前6个元素的和;s[i]-s[i-a]即为nums中a个连续元素的和,用t来表示,t+s[i+b]-s[i]即表示nums中a个连续元素的和 和 b个连续元素的和。
  2. 借助 Math.max(a,b) 求a和b的最大值
class Solution {
    private int[] s;
    private int n;
    public int maxSumTwoNoOverlap(int[] nums, int firstLen, int secondLen) {
        n= nums.length;
        //借助辅助求和数组
        s = new int[n+1];
        for(int i=1;i<s.length;i++){
            s[i] = s[i-1] + nums[i-1];//s[i]表示nums[i]前i个元素的和
        }
        //借助Math.max(a,b)求最大值
        return Math.max(f(firstLen, secondLen), f(secondLen, firstLen));
    }

    private int f(int a, int b){
        int ans = 0;//最大值的结果
        for(int i=a, t=0;(i+b)<n+1; i++){//t用来统计a的和
            t = Math.max(t, s[i]-s[i-a]);
            ans = Math.max(ans, t+s[i+b]-s[i]);
        }
        return ans;
    }
}

猜你喜欢

转载自blog.csdn.net/Miss_croal/article/details/130388105