689 Maximum Sum of 3 Non-Overlapping Subarrays

题目
思路:首先是长度为k的子数组的和。这个好计算。题目要求返回的是三个和最大的子数组的第一个数字的下标。下标要尽可能小。如果只要求这样,题目就很简单了。还有个要求是各个子数组不重叠。要想不重叠首先得要求下标不重叠。子数组1下标是:0,1,2;子数组2下标如果是1,2,3那肯定会重叠。其次要计算出每个子数组的最大值,最小值。在找下个子数组的时候,范围不能在这之间。我应该是傻眼了。需要考虑的因素比较多。看别人怎么解吧。
学习:看了别人的解法,明白题目意思了解错了。不重叠的子数组就是指下标不重叠,而不是各个值不重叠。要返回的三个下标(idx1,idx2,idx3) 满足idx2>=idx1+kidx2>=idx1+k 并且 idx3>=idx2+kidx3>=idx2+k
还要学习的一点是:当计算了长度为k的子数组的和,计算之后其实得到了一个sums的数组。sums[i]表示以i为起点的长度为k的子数组的和。sums的长度是n-k+1。如此看待问题会比较简单一些。
对于求这三个下标我一开始的做法是:

        int max1 = sums[0],max2 = sums[0+k],max3 = sums[0+2*k];int idx1 = 0,idx2 = k,idx3 = 2*k;for (i = 1; i < k; i++) {if (sums[i] > max1) {max1 = sums[i];idx1 = i;}if (i+k <n && sums[i+k] > max2) {max2 = sums[i+k];idx2 = i+k;}if (i+2*k < n && sums[i+2*k] > max3) {max3 = sums[i+2*k];idx3 = i+2*k;}}

这样做的问题是:可能idx2没有变化,idx1变化了。这样他们的差值就不是k,就不能符合条件了。所以需要固定idx2的位置。n=sums.length;那么idx1[0,idx2k]idx1∈[0,idx2−k] 并且 idx3[idx2+1,n1]idx3∈[idx2+1,n−1]。而idx2能够取值的范围是[k,nk1][k,n−k−1]。(n是原始数组长度)。

当idx2位置固定,对于idx1应该是[0,idx2-k]那个最大数的下标。这个问题可以用动态规划解决。用一个数组先保存从[0,当前位置]值最大的下标。动态转移方程式: 如果sums[i]>sums[left[i1]]sums[i]>sums[left[i−1]],则left[i]=ileft[i]=i;否则left[i]=left[i1]left[i]=left[i−1]。当然这里不用动态规划,那就每次循环一下从0到idx2-k找到最大值的下标。

右边也是一样。当idx2位置固定,对于idx3应该是[idx2+1,n-1]那个最大数的下标。用动态规划解决。用一个数组先保存从[当前位置,n-1]值最大的下标。动态转移方程式: 如果sums[i]>=sums[right[i+1]]sums[i]>=sums[right[i+1]],则right[i]=iright[i]=i;否则right[i]=right[i+1]right[i]=right[i+1]。这里的条件是>=>=是因为,结果要求返回下标最小值。

学习链接

public int[] maxSumOfThreeSubarrays(int[] nums, int k) {int n = nums.length;//计算和,因为入参都是正数,所以不需要初始化sums,否则可以都初始化为Integer.MIN_VALUE;int[] sums = new int[n];//这步可以优化//0,1 1,2  2,3 3,4  4,5 5,6int sum = 0;for (int i = 0; i <n; i++) {sum += nums[i];if(i>=k) sum -= nums[i-k];if(i>=k-1) sums[i-k+1] = sum; }//与左边的数组比较int[] left = new int[n-k+1];int best = 0;for(int i=0;i<left.length;i++){if(sums[i]>sums[best]) best = i;left[i] = best;}//跟右边的数组比较int[] right = new int[n-k+1];best = right.length - 1;for(int i = right.length -1;i>=0;i--){if(sums[i]>=sums[best]) best = i;right[i] = best;}int idx1 = -1,idx2 = -1,idx3 = -1;for (int j = k; j < right.length-k; j++) {int l = left[j-k],r = right[j+k];if(idx1==-1 || (sums[idx1]+sums[idx2]+sums[idx3] < sums[l]+sums[j]+sums[r])){idx1 = l;idx2 = j;idx3 = r;}}return new int[]{idx1,idx2,idx3};}

复杂度分析:时间复杂度O(n),空间复杂度O(n)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/424790.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Leetcode][第557题][JAVA][反转字符串中的单词 III][遍历][String函数]

【问题描述】[简单] 【解答思路】 1. 遍历 开辟一个新字符串。然后从头到尾遍历原字符串&#xff0c;直到找到空格为止&#xff0c;此时找到了一个单词&#xff0c;并能得到单词的起止位置。随后&#xff0c;根据单词的起止位置&#xff0c;可以将该单词逆序放到新字符串当中…

第七十二期:爬虫爬的好,牢饭吃到饱?

前几天分享的一篇《只因写了一段爬虫&#xff0c;公司200多人被抓!》相信大家看了后都会发问&#xff0c;我只是个写爬虫的&#xff0c;跟我有什么关系?到底什么样的爬虫才不犯法?今天这篇会解答你所有的疑问。 作者&#xff1a;技术领导力 前几天分享的一篇爬虫被抓相信大…

如何在Swift中创建漂亮的iOS图表

通过图形和图表呈现数据是当今移动应用程序最显着的特征之一。iOS图表使应用程序看起来更漂亮&#xff0c;更有吸引力。 在本教程中&#xff0c;我们将向您展示如何使用代码示例在Swift中实现我们的iOS图表。我们将看一下Swift折线图&#xff0c;饼图以及条形图。 您可以找到许…

第七十四期:从bug看11种编程语言演化史,果然如今Python比较流行

在本文中&#xff0c;作者选择了 11 种非常流行的编程语言&#xff08;通过 Stack Overflow 标签出现的频率衡量&#xff09;&#xff0c;希望可以找出这些问题的共性及差异性。 作者&#xff1a;机器之心编译来源&#xff1a;机器之心 自 2008 年创办以来&#xff0c;Stack …

[Leetcode][第841题][JAVA][钥匙和房间][DFS][BFS]

【问题描述】[中等] 【解答思路】 当 xx 号房间中有 yy 号房间的钥匙时&#xff0c;我们就可以从 xx 号房间去往 yy 号房间。如果我们将这 nn 个房间看成有向图中的 nn 个节点&#xff0c;那么上述关系就可以看作是图中的 xx 号点到 yy 号点的一条有向边。 这样一来&#xff…

LinkedList专题1

237 Delete Node in a Linked List 思路&#xff1a;单向链表&#xff0c;只给定要删除的节点。怎么删除这个节点。参考。例如要删除节点node。一般来说我们需要将node.preNode.next node.next。但是现在没有node的上一个节点。代替方案是修改当前节点为node.next节点。 node…

死磕 java同步系列之开篇

简介 同步系列&#xff0c;这是彤哥想了好久的名字&#xff0c;本来是准备写锁相关的内容&#xff0c;但是java中的CountDownLatch、Semaphore、CyclicBarrier这些类又不属于锁&#xff0c;它们和锁又有很多共同点&#xff0c;都是为了协同多线程的执行&#xff0c;都是一种同步…

第七十五期:Java 2019 生态圈使用报告,这结果你赞同吗?

这是国外一机构调查了 7000 名开发者得出来的 Java 2019 年生态圈工具使用报告&#xff0c;主要调查了 Java 版本、开发框架、web 服务器等使用情况。 作者&#xff1a;平头哥来源 这是国外一机构调查了 7000 名开发者得出来的 Java 2019 年生态圈工具使用报告&#xff0c;主…

[Leetcode][第486题][JAVA][预测赢家][动态规划][递归]

【问题描述】[中等] 【解答思路】 1.递归 复杂度 class Solution {public boolean PredictTheWinner(int[] nums) {return total(nums,0,nums.length-1,1) >0;}//turn 标记轮到谁了 正数表示先手 负数表示后手 public int total( int[]nums ,int start,int end,int tur…

linux-2.6.38 input子系统(用输入子系统实现按键操作)

一、设备驱动程序 在上一篇随笔中已经分析&#xff0c;linux输入子系统分为设备驱动层、核心层和事件层。要利用linux内核中自带的输入子系统实现一个某个设备的操作&#xff0c;我们一般只需要完成驱动层的程序即可&#xff0c;核心层和事件层内核已经帮我们做好了。因此这篇随…

LinkedList专题2

203 Remove Linked List Elements 思路&#xff1a;考虑1 &#xff1a; 可能有多个节点符合&#xff1b;考虑2&#xff1a;命中节点是head&#xff1b;考虑3&#xff1a;命中节点是尾节点&#xff1b;考虑4&#xff1a;命中节点是中间的普通节点。 学习1&#xff1a;在linked…

第四十一期:一道经典的MySQL面试题,答案出现三次反转

前几天偶然看到大家在讨论一道面试题&#xff0c;而且答案也不够统一&#xff0c;我感觉蛮有意思&#xff0c;在此就做一个解读&#xff0c;整个过程中确实会有几处反转。 作者&#xff1a;杨建荣的学习笔记来源&#xff1a;今日头条 前几天偶然看到大家在讨论一道面试题&…

java中资源获取

安装java sudo apt-get install default-jdk 获取doc $dpkg -l | grep jdk ii default-jdk 2:1.8-56ubuntu2 amd64 Standard Java or Java compatible Development Kit ii default-jdk-headless …

LinkedList专题3

148. Sort List 问题&#xff1a;要求时间度O(NlogN)O(NlogN)&#xff0c;空间复杂度是常数&#xff0c;实现数组排序。 思路&#xff1a;之前做过linkedList的插入排序&#xff0c;时间复杂度应该是O(n2)O(n2)。时间复杂度控制在nlogn 一定有二分。二分我只在数组版的list中…

java面试题1 牛客:A派生出子类B,B派生出子类C,并且在java源代码中有如下声明:

懵逼树上懵逼果&#xff0c;懵逼树下你和我 第一题 [单选题] A派生出子类B&#xff0c;B派生出子类C&#xff0c;并且在java源代码中有如下声明&#xff1a; 1 2 3 A a0new A(); A a1new B(); A a2new C(); 以哪个说法是正确的 A第1行&#xff0c;第2行和第3行的声明都是正…

[Leetcode][第81题][JAVA][N皇后问题][回溯算法]

【问题描述】[困难] 【解答思路】 1. 主副对角线列 标记 复杂度 import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Deque; import java.util.List;public class Solution {private int n;// 记录某一列是否放置了皇后private boolean[] col;// 记…

编码解码错误

python读取文件时提示UnicodeDecodeError错误&#xff1a; "UnicodeDecodeError: gbk codec cant decode byte 0x80 in position 205: illegal multibyte sequence" “UnicodeDecodeError: cp950 codes cant decode byte oxc3 in position 25402: illegal multibyte …

java面试题2 牛客:定义类中成员变量时不可能用到的修饰是

懵逼树上懵逼果&#xff0c;懵逼树下你和我 第二题 定义类中成员变量时不可能用到的修饰是&#xff08;&#xff09; A final B void C protected D static 一看到这道题&#xff0c;有点慌了&#xff0c;直接选c&#xff0c;很显然&#xff0c;我又错了&#xff0c;难题…

[Leetcode][第257题][JAVA][二叉树的所有路径][BFS][DFS]

【问题描述】[简单] 【解答思路】 1. DFS 时间复杂度&#xff1a;O(N^2) 空间复杂度&#xff1a;O(N^2) class Solution {public List<String> binaryTreePaths(TreeNode root) {List<String> paths new ArrayList<String>();constructPaths(root, "…

Depth-first Search深度优先搜索专题1

104. Maximum Depth of Binary Tree 思路&#xff1a;顺着树的一个分支一直数层数直到叶子节点。DFS的思路。这个题目可以练习的是递归转迭代。 代码 695. Max Area of Island 思路&#xff1a;遇到点i,j;如果grid[i][j]没有被访问过&#xff0c;并且等于1&#xff0c;那么…