【LeetCode】三个无重叠子数组的最大和 [H](动态规划)
admin
2024-02-20 05:56:41
0

689. 三个无重叠子数组的最大和 - 力扣(LeetCode)

一、题目

给你一个整数数组 nums 和一个整数 k ,找出三个长度为 k 、互不重叠、且全部数字和(3 * k 项)最大的子数组,并返回这三个子数组。

以下标的数组形式返回结果,数组中的每一项分别指示每个子数组的起始位置(下标从 0 开始)。如果有多个结果,返回字典序最小的一个。

示例 1:
输入:nums = [1,2,1,2,6,7,5,1], k = 2
输出:[0,3,5]
解释:子数组 [1, 2], [2, 6], [7, 5] 对应的起始下标为 [0, 3, 5]。
也可以取 [2, 1], 但是结果 [1, 3, 5] 在字典序上更大。

示例 2:
输入:nums = [1,2,1,2,1,2,1,2,1], k = 2
输出:[0,2,4]

提示:

二、代码

class Solution {public int[] maxSumOfThreeSubarrays(int[] nums, int k) {int n = nums.length;// left[i]:从0~i范围上长度为k的子数组中,累加和最大是多少int[] left = new int[n];// leftStartIndex[i]:从0~i范围上长度为k的子数组中,累加和最大的起始下标是是多少,和left[]是成对使用的int[] leftStartIndex = new int[n];// right[i]:从i~n-1范围上长度为k的子数组中,累加和最大是多少int[] right = new int[n];// rightStartIndex[i]:从i~n-1范围上长度为k的子数组中,累加和最大的起始下标是是多少,和left[]是成对使用的int[] rightStartIndex = new int[n];// 构造left[]和leftStartIndex[]int sum = 0;// 先生成第一个长度为k的子数组的窗口for (int i = 0; i < k; i++) {sum += nums[i];}left[k - 1] = sum;leftStartIndex[k - 1] = 0;// 窗口向右滑动,构造left[]和leftStartIndex[]for (int i = k; i < n; i++) {sum = sum - nums[i - k] + nums[i];// 比较以i结尾的长度为k的子数组累加和和left[i - 1]最大累加和,哪个大就将哪个值赋值给left,并记录当前这种情况的子数组起始位置。  // 这里要写等于号,因为要保证值相同的情况下,字典序小的返回if (left[i - 1] >= sum) {left[i] = left[i - 1];leftStartIndex[i] = leftStartIndex[i - 1];} else {left[i] = sum;leftStartIndex[i] = i - k + 1;}}// 构造right[]和rightStartIndex[]sum = 0;// 先生成第一个长度为k的子数组的窗口for (int i = n - 1; i >= n - k; i--) {sum += nums[i];}right[n - k] = sum;rightStartIndex[n - k] = n - k;// 窗口向左滑动,构造right[]和rightStartIndex[]for (int i = n - k - 1; i >= 0; i--) {sum = sum - nums[i + k] + nums[i];// 比较以i开始的长度为k的子数组累加和和right[i + 1]最大累加和,哪个大就将哪个值赋值给right,并记录当前这种情况的子数组起始位置。 // 这里不写等于号,因为要保证值相同的情况下,字典序小的返回  if (right[i + 1] > sum) {right[i] = right[i + 1];rightStartIndex[i] = rightStartIndex[i + 1];} else {right[i] = sum;rightStartIndex[i] = i;}}// 构造长度为k的窗口,保证窗口的左部分和右部分至少有k个字符,然后将这个窗口向右滑动尝试所有的情况,然后从左右部分找到最大累加和的子数组,将所有情况都列举一边,找打三个数组累加和最大的情况,并将他们的起始位置返回sum = 0;// 一开始要保证左部分至少有k个字符for (int i = k - 1; i < 2 * k - 1; i++) {sum += nums[i];}int max = Integer.MIN_VALUE;int[] ans = new int[3];int ansSum;// 窗口做边界不能超过这个位置,因为要保证右部分至少有k个字符int limit =  n - 2 * k;for (int l = k; l <= limit; l++) {int r = l + k - 1;sum = sum - nums[l - 1] + nums[r];// 计算当前情况三个子数组的累加和ansSum = left[l - 1] + sum + right[r + 1];// 如果大于当前最大累加和,则重新更新maxif (max < ansSum) {max = ansSum;ans[0] = leftStartIndex[l - 1];ans[1] = l;ans[2] = rightStartIndex[r + 1];}}return ans;}
}

三、解题思路 

我们要选三个不相交的长度为k的子数组。

先让L到R的距离为K,L...R是中间的子数组,这就算是找到了一个子数组,然后再从0~L-1范围上找到一个长度为k的子数组,从R+1~N-1范围上找到一个长度为K的子数组,这样一共就找到了三个子数组。

后我们再让L~R向右滑动,尝试所有可能的中间数组的情况,当完成处理后,就找所有情况中三个字数组累加和最大的那一组,然后将它们的起始位置返回即可。

相关内容

热门资讯

安卓系统最强定位手机版,最强定... 你有没有想过,在茫茫人海中,如何让你的手机定位功能像侦探一样精准无误?今天,就让我带你一探究竟,揭秘...
安卓运行环境选哪个系统,And... 你有没有想过,你的安卓手机到底是在哪个运行环境下才能发挥出最佳性能呢?这可是个技术活儿,选对了系统,...
zui15系统是安卓系统吗,揭... 亲爱的读者,你是否曾好奇过,那些在手机上运行得风生水起的系统,它们究竟是不是安卓的呢?今天,就让我带...
ios系统和安卓系统权限区别,... 你有没有发现,无论是手机还是平板,我们用的最多的就是那些APP了。而这些APP,它们在手机里可是有着...
荣耀手环6安卓版系统,智能生活... 你有没有注意到,最近你的手腕上是不是多了一抹亮丽的色彩?没错,说的就是荣耀手环6安卓版系统!这款智能...
极品奴隶系统下载安卓版,体验独... 你有没有听说过那个超级火的“极品奴隶系统”安卓版?最近,这款游戏在朋友圈里可是炸开了锅,大家都说它好...
安卓手机苹果系统扣费,揭秘扣费... 你有没有遇到过这种情况?手机里突然多了一笔扣费,而且还是那种你完全没意识到的扣费?尤其是当你用的是安...
安卓系统智能电视刷机,焕新体验 亲爱的电视迷们,你是否曾为你的安卓智能电视的性能所困扰?是不是觉得它运行缓慢,功能受限?别担心,今天...
安卓系统无法安装applica... 最近是不是遇到了安卓系统无法安装application的烦恼?别急,让我来帮你一探究竟,解决这个让人...
怎么取消安卓系统锁屏,解锁锁屏... 手机锁屏功能虽然能保护我们的隐私,但有时候也会让人头疼,比如忘记密码或者想快速查看信息时。那么,怎么...
安卓系统高德怎么下载,轻松获取... 你有没有发现,现在手机上导航软件真是越来越方便了?尤其是安卓系统的用户,高德地图这款神器简直成了出行...
安卓系统的开源部分,开源代码背... 你知道吗?安卓系统,这个在我们手机上无处不在的小家伙,竟然有一部分是开源的!是不是觉得有点神奇?别急...
小米下载安卓13系统,畅享智能... 亲爱的手机控们,你是否已经迫不及待想要体验最新的操作系统呢?没错,我说的就是安卓13系统!而今天,我...
安卓系统如何设置拍月亮,捕捉夜... 月亮,那轮皎洁的夜空明珠,总是让人心生向往。你是否也想用你的安卓手机捕捉到它的美丽瞬间呢?别急,今天...
安卓v8以上系统,探索安卓V8... 你知道吗?最近手机界可是掀起了一股新潮流,那就是安卓V8以上系统。这可不是什么小打小闹,而是实实在在...
安卓系统兼容哪个版本好,哪个版... 你有没有想过,你的安卓手机到底兼容哪个版本的系统最好呢?这可是个技术活儿,得好好研究研究。别急,今天...
安卓平板安装linux桌面系统... 你有没有想过给你的安卓平板来个变身大法?没错,就是给它安装一个Linux桌面系统!想象原本只能刷刷剧...
安卓什么手机系统bug最少,揭... 你有没有发现,用安卓手机的时候,有时候会遇到一些小麻烦,比如系统突然卡顿,或者某个应用突然崩溃,真是...
手机软件安卓下载系统,解锁手机... 你有没有发现,现在的生活越来越离不开手机了?手机里装满了各种各样的软件,让我们的生活变得更加便捷。今...
微软系统和安卓系统的cad软件... 你有没有想过,为什么你的电脑里装的是微软系统,而朋友的手机上却是安卓系统?这背后其实隐藏着一场关于操...