首页 > 其他分享 >【前缀和】LeetCode 1031. 两个非重叠子数组的最大和

【前缀和】LeetCode 1031. 两个非重叠子数组的最大和

时间:2023-04-14 10:37:29浏览次数:60  
标签:前缀 nums int 最大值 firstLen 数组 secondLen 1031 LeetCode

题目链接

1031. 两个非重叠子数组的最大和

思路

代码

class Solution {
    public int maxSumTwoNoOverlap(int[] nums, int firstLen, int secondLen) {
        // 求一个前缀和
        for(int i = 1; i < nums.length; ++i){
            nums[i] += nums[i - 1];
        }

        // 初始化最终最大值的初始值,初始化firstLen子数组和最大值,初始值化secondLen子数组和最大值
        // 初始化后,是前缀和数组中满足当前子数组长度下最靠左边的几个元素值
        int result = nums[firstLen + secondLen - 1], Lmax = nums[firstLen - 1], Mmax = nums[secondLen - 1];
        for(int i = firstLen + secondLen; i < nums.length; ++i){
            // 从前往后遍历数组,找长度为firstLen的子数组最大和,此时是模拟firstLen数组在secondLen数组左边
            // nums[i - secondLen]是当前位置,M长度子数组之前的第一个元素
            Lmax = Math.max(Lmax, nums[i - secondLen] - nums[i - firstLen - secondLen]);
            // 从前往后遍历数组,找长度为secondLen的子数组最大和,此时是模拟secondLen数组在firstLen数组左边
            // nums[i - firstLen]是当前位置,firstLen长度子数组之前的第一个元素
            Mmax = Math.max(Mmax, nums[i - firstLen] - nums[i - firstLen - secondLen]);
            // 比较firstLen在左边的最大值+最近的一个secondLen子数组和,M在左边并取最大值+最近的一个firstLen子数组和
            result = Math.max(result, Math.max(
                    Lmax + nums[i] - nums[i - secondLen], Mmax + nums[i] - nums[i - firstLen]));
        }

        return result;
    }
}

标签:前缀,nums,int,最大值,firstLen,数组,secondLen,1031,LeetCode
From: https://www.cnblogs.com/shixuanliu/p/17317527.html

相关文章

  • 【DP】【分治】LeetCode 53. 最大子数组和
    题目链接[https://leetcode.cn/problems/maximum-subarray/description/](53.最大子数组和"https://leetcode.cn/problems/maximum-subarray/description/")思路分析动态规划题目的时候只需要考虑最后一个阶段,因为所有的阶段转化都是相同的,考虑最后一个阶段容易发现规律在数......
  • 剑指 Offer 09. 用两个栈实现队列 && leetcode225.用队列实现栈
     剑指Offer09.用两个栈实现队列 classCQueue{private:stack<int>inStack,outStack;voidin2out(){//这里必须是while循环,如果是if判断,则输出栈日常只有一个值,没有起到先入后出的作用while(!inStack.empty()){//将输入栈栈顶......
  • leetcode:路径总和 III
    问题描述给定一个二叉树的根节点root ,和一个整数targetSum,求该二叉树里节点值之和等于targetSum的路径的数目。路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。示例1输入:root=[10,5,-3,3,2,null,11,3,-2,null,1],ta......
  • #yyds干货盘点# LeetCode程序员面试金典:两两交换链表中的节点
    题目:给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 示例1:输入:head=[1,2,3,4]输出:[2,1,4,3]示例2:输入:head=[]输出:[]示例3:输入:head=[1]输出:[1]代码实现:classSolution{publicListN......
  • #yyds干货盘点# LeetCode面试题:颜色分类
    1.简述:给定一个包含红色、白色和蓝色、共 n个元素的数组 nums ,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。我们使用整数0、 1和2分别表示红色、白色和蓝色。必须在不使用库内置的sort函数的情况下解决这个问题。 示例1:输入:nums=[2,0......
  • leetcode_打卡3
    leetcode_打卡3题目:1431.拥有最多糖果的孩子解答:classSolution{publicList<Boolean>kidsWithCandies(int[]candies,intextraCandies){intmax=0;intn=candies.length;List<Boolean>result=newArrayList<Boolean>();......
  • leetcode_打卡2
    leetcode_打卡21071.字符串的最大公因子思路:该题的答案一定是两个字符串的公共前缀,找到最大公共前缀,并且验证这个前缀能否被两个字符串除尽!classSolution{publicStringgcdOfStrings(Stringstr1,Stringstr2){intlen1=str1.length();intlen2=......
  • 回溯理论基础及leetcode
    回溯与递归相辅相成;回溯是递归的副产品,只要有递归就会有回溯。回溯函数也就是递归函数,指的都是一个函数。回溯搜索法纯暴力搜索解决的问题组合问题:N个数里面按一定规则找出k个数的集合切割问题:一个字符串按一定规则有几种切割方式子集问题:一个N个数的集合里有多少符合条......
  • #yyds干货盘点# LeetCode面试题:搜索二维矩阵
    1.简述:编写一个高效的算法来判断 mxn 矩阵中,是否存在一个目标值。该矩阵具有如下特性:每行中的整数从左到右按升序排列。每行的第一个整数大于前一行的最后一个整数。 示例1:输入:matrix=[[1,3,5,7],[10,11,16,20],[23,30,34,60]],target=3输出:true示例2:输入:matrix=[[1,......
  • Leetcode 2. 两数相加
    这道题让我想起了acwing里的高精度加法,因为这里的加法也是超过100位了。于是套着模板写了一下,然后看了一下评论区,发现链表再套vector属于是脱裤子放屁了/***Definitionforsingly-linkedlist.*structListNode{*intval;*ListNode*next;*ListNod......