【leetcode】689. Maximum Sum of 3 Non-Overlapping Subarrays
时间:2019-10-02
本文章向大家介绍【leetcode】689. Maximum Sum of 3 Non-Overlapping Subarrays,主要包括【leetcode】689. Maximum Sum of 3 Non-Overlapping Subarrays使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题目如下:
In a given array
nums
of positive integers, find three non-overlapping subarrays with maximum sum.Each subarray will be of size
k
, and we want to maximize the sum of all3*k
entries.Return the result as a list of indices representing the starting position of each interval (0-indexed). If there are multiple answers, return the lexicographically smallest one.
Example:
Input: [1,2,1,2,6,7,5,1], 2 Output: [0, 3, 5] Explanation: Subarrays [1, 2], [2, 6], [7, 5] correspond to the starting indices [0, 3, 5]. We could have also taken [2, 1], but an answer of [1, 3, 5] would be lexicographically larger.Note:
nums.length
will be between 1 and 20000.nums[i]
will be between 1 and 65535.k
will be between 1 and floor(nums.length / 3).
解题思路:本题如果只要求求出三段子数组的和的最大值,那会简单很多。记total[i]为arr[i:i+k]段的和,dp_left_max[i]为nums[:i]区间内长度为k的子数组的和的最大值,dp_right_max[i]为nums[i:len(nums)]区间内长度为k的子数组的和的最大值,很显然如果中间段的子数组的下标为k,那么可以得到三段和的最大长度的表达:total[i] + dp_left_max[i-k] + dp_right_max[i+k] 。只要遍历数组arr,即可求出最大值。求出后就是计算出左边以及右边最大值出现时的最小下标,这个可以通过二分查找实现。
代码如下:
class Solution(object): def maxSumOfThreeSubarrays(self, nums, k): """ :type nums: List[int] :type k: int :rtype: List[int] """ count = sum(nums[:k]) total = [count] total_inx = {} total_inx[count] = [0] dp_left_max = [count] dp_left_max_count = count for i in range(k, len(nums)): count -= nums[i - k] count += nums[i] total += [count] total_inx[count] = total_inx.setdefault(count,[]) + [i-k + 1] dp_left_max_count = max(dp_left_max_count,count) dp_left_max.append(dp_left_max_count) reverse_num = nums[::-1] count = sum(reverse_num[:k]) dp_right_max = [count] dp_right_max_count = count for i in range(k, len(reverse_num)): count -= reverse_num[i - k] count += reverse_num[i] dp_right_max_count = max(dp_right_max_count,count) dp_right_max.insert(0,dp_right_max_count) #print total #print total_inx #print dp_left_max #print dp_right_max max_sum = -float('inf') mid_inx = 0 left_val = 0 right_val = 0 for i in range(k,len(nums)-k-k+1): count = total[i] + dp_left_max[i-k] + dp_right_max[i+k] if count > max_sum: mid_inx = i left_val = dp_left_max[i-k] right_val = dp_right_max[i+k] max_sum = count #print left_val,mid_inx,right_val left_inx = total_inx[left_val][0] import bisect right_inx = bisect.bisect_left(total_inx[right_val],mid_inx+k) return [left_inx,mid_inx,total_inx[right_val][right_inx]]
原文地址:https://www.cnblogs.com/seyjs/p/11616699.html
- Isolation Forest算法实现详解
- css继承样式怎么控制?用选择器
- wordpress站内搜索结果页URL伪静态如何操作
- 如何实现大图居中超过的部分两边自动隐藏
- Ubuntu16.04安装后开发环境配置和常用软件安装
- wordpress如何屏蔽wp-json(禁用REST API)
- 贝叶斯系列——贝叶斯与其他统计流派的区别和联系
- bootstrap tab切换如何让鼠标移动自动切换内容
- css自动换行如何设置?url太长会撑开页面
- Histogram of Oriented Gridients(HOG) 方向梯度直方图
- 动态规划系列之最长递增子序列问题解答
- Git SSH Key 生成步骤
- 如何将wordpress所有文章批量改为已发布状态
- dedecms提取某栏目及子栏目名称到首页怎么弄
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Linux中创建新用户并赋予指定目录的相关权限
- Linux服务器下安装配置Nginx的教程
- Linux文件目录结构(小白版)
- 基于Linux中vnc配置端口号的修改方法
- Linux下安装grafana并且添加influxdb监控的方法
- 玩命学JVM:认识JVM和字节码文件
- 使用CatBoost进行不确定度估算:模型为何不确定以及如何估计不确定性水平
- 拒绝 kill -9,让 SpringBoot 优雅停机!
- SpringBoot整合Activiti7的实现代码
- Linux工具之Nethogs按进程监控网络带宽的安装部署
- 实现防重复提交和防重复点击
- Linux系统禁止root账号远程登录的命令
- 详解CentOS7 安装 MariaDB 10.2.4的方法
- linux允许端口远程访问开放端口的方法
- linux操作系统利用python实现任务管理器可视化功能