[Leetcode][第410题][JAVA][分割数组的最大值][动态规划][二分]

【问题描述】[中等]

在这里插入图片描述

【解答思路】

1. 动态规划

第 1 步:设计状态
令 f[i][j] 表示将数组的前 i 个数分割为 j 段所能得到的最大连续子数组和的最小值。 ( i ≥ j )
第 2 步:状态转移方程
在这里插入图片描述

第 3 步:考虑初始化
f[i][j] = Integer.MAX_VALUE
f[0][0]=0
第 4 步:考虑输出
f[n][m]f[n][m]

复杂度
在这里插入图片描述

class Solution {public int splitArray(int[] nums, int m) {int n = nums.length;int[][] f = new int[n + 1][m + 1];for (int i = 0; i <= n; i++) {Arrays.fill(f[i], Integer.MAX_VALUE);}int[] sub = new int[n + 1];for (int i = 0; i < n; i++) {sub[i + 1] = sub[i] + nums[i];}f[0][0] = 0;for (int i = 1; i <= n; i++) {for (int j = 1; j <= Math.min(i, m); j++) {for (int k = 0; k < i; k++) {f[i][j] = Math.min(f[i][j], Math.max(f[k][j - 1], sub[i] - sub[k]));}}}return f[n][m];}
}
2. 二分+贪心

在这里插入图片描述
nums = [7,2,5,10,8]
m = 1,那么整个数组作为一部分,最小的最大值为 32
m = n,那么每个元素作为一个子数组,从所有元素选取最大值,最小的最大值小为 10
m 的取值范围为 1 <= m <= n,因此,最大值的最小值的范围为 [10, 32]
我们利用二分法查找,找出符合 m 的最大值的最小的结果
二分过程:
left = 10;
right = 32
mid = (left + right) >>> 1 = 21(这个 21 就是一个子数组的最大容量)
我们假设刚开辟的用来存储的子数组个数 cnt = 1
那么根据贪心思想,我们将数组元素按顺序逐个往里放
因此就有如下过程:
7 < 21
7 + 2 < 21
7 + 2 + 5 < 21
7 + 2 + 5 + 10 > 21
至此,我们可以看出一个 21 容量的子数组是无法容纳整个数组元素的,因此我们需要开辟第二个子数组来存储剩下的数组元素
cnt = cnt + 1 = 2
10 < 21
10 + 8 < 21
我们发现,两个子数组可以将整个数组元素放入,而 cnt 刚好等于 m,因此 [7,2,5] 和 [10,8] 就是分割出来的两个子数组,最小的最大值为 18

区间缩小 (建议在草稿纸上模拟过程)

  1. [10.31]
  2. [10.21]
  3. [16,21]
  4. [16,18]
  5. [17.18]
  6. [18.18]

为什么是放入元素直到放不下为止?因为要求的是连续子数组,我们需要保证每个连续的子数组的元素和都尽可能的接近 21

如果我们最终得到的 cnt > m,那么表示我们划分出太多的子数组,也就是意味着一个子数组的容量太少,我们需要再扩大容量,即 left = mid + 1,然后继续进行二分
如果我们最终得到的 cnt < m,那么表示我们划分出太少的子数组,也就是意味着一个子数组的容量太大,需要减少容量,即 right = mid

复杂度
在这里插入图片描述

public class Solution {public int splitArray(int[] nums, int m) {int max = 0;int sum = 0;// 计算「子数组各自的和的最大值」的上下界for (int num : nums) {max = Math.max(max, num);sum += num;}// 使用「二分查找」确定一个恰当的「子数组各自的和的最大值」,// 使得它对应的「子数组的分割数」恰好等于 mint left = max;int right = sum;while (left < right) {int mid = left + (right - left) / 2;int splits = split(nums, mid);if (splits > m) {// 如果分割数太多,说明「子数组各自的和的最大值」太小,此时需要将「子数组各自的和的最大值」调大// 下一轮搜索的区间是 [mid + 1, right]left = mid + 1;} else {// 下一轮搜索的区间是上一轮的反面区间 [left, mid]right = mid;}}return left;}/***** @param nums 原始数组* @param maxIntervalSum 子数组各自的和的最大值* @return 满足不超过「子数组各自的和的最大值」的分割数*/private int split(int[] nums, int maxIntervalSum) {// 至少是一个分割int splits = 1;// 当前区间的和int curIntervalSum = 0;for (int num : nums) {// 尝试加上当前遍历的这个数,如果加上去超过了「子数组各自的和的最大值」,就不加这个数,另起炉灶if (curIntervalSum + num > maxIntervalSum) {curIntervalSum = 0;splits++;}curIntervalSum += num;}return splits;}public static void main(String[] args) {int[] nums = new int[]{7, 2, 5, 10, 8};int m = 2;Solution solution = new Solution();int res = solution.splitArray(nums, m);System.out.println(res);}
}

【总结】

1. 动态规划流程

第 1 步:设计状态
第 2 步:状态转移方程
第 3 步:考虑初始化
第 4 步:考虑输出
第 5 步:考虑是否可以状态压缩

2.细节

Arrays.fill()并不能提高赋值的效率,在函数的内部也是用for循环的方式 实现的。
fill()函数源码:

    public static void fill(Object[] a, Object val) {for (int i = 0, len = a.length; i < len; i++)a[i] = val;}
 for (int i = 0; i <= n; i++) {Arrays.fill(f[i], Integer.MAX_VALUE);}

等价于

for (int i = 0; i <= n; i++) {for(int j =0 ;j<=m;j++){f[i][j] = Integer.MAX_VALUE;}}
3.审题认真! Java函数不懂可以看源码, 效率超高!(总比瞎猜好)

参考链接:https://leetcode-cn.com/problems/split-array-largest-sum/solution/er-fen-cha-zhao-by-liweiwei1419-4/
参考链接:https://leetcode-cn.com/problems/split-array-largest-sum/solution/fen-ge-shu-zu-de-zui-da-zhi-by-leetcode-solution/

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

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

相关文章

数据结构与算法分析

本系列的笔记基于七月算法的《求职面试》课程以及《数据结构域算法分析-java语言描述》第2版&#xff0c;做学习笔记。 以下是这系列的目录。每个专题只做笔记&#xff0c;不求每个专题都要深入到很深很深。算法分析 表 栈 队列 并查集 哈希表 树 堆 图论 递归 深度优…

[算法][算法复杂度]常用算法复杂度速查表

复杂度通常会使用大 -O记号来表示&#xff0c;比如快速排序的平均时间复杂度是 O(nlog(n))。虽然我们应该做「理解派」&#xff0c;但是即使每个算法/数据结构都理解了&#xff0c;不时仍有可能忘记具体某个算法/数据结构的复杂度&#xff08;特别是在最好、最坏和平均情形下的…

十张伟大的科学瞬间

题图&#xff1a; 搭载 ORBCOMM OG2-M1 卫星的猎鹰 9 号运载火箭发射&#xff0c;人类一直很渺小。 ▎2019 更新 北京时间 2019 年 4 月 10 日 21 点&#xff0c;人类首张黑洞照片正式发布&#xff01; 这次的直接成像除了帮助我们直接确认了黑洞的存在&#xff0c;同时也通过模…

[Leetcode][第329题][JAVA][矩阵中的最长递增路径][DFS][拓扑排序]

【问题描述】[中等] 【解答思路】 1. 记忆化深度优先搜索 复杂度 class Solution {public int[][] dirs {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};public int rows, columns;public int longestIncreasingPath(int[][] matrix) {if (matrix null || matrix.length 0 || matri…

第二十八期:阿里云VS腾讯云 谁才是中国未来的云计算之王?

阿里云早在 2009 年就已经开始布局云计算领域&#xff0c;具有先发优势。据统计&#xff0c;40% 的中国 500 强企业、近一半中国上市公司、80% 中国科技类公司是阿里云的客户。而腾讯云基于腾讯自身在游戏、视频、社交、出行等业务的强势地位&#xff0c;一路奋起直追&#xff…

[小技巧][JAVA][转换]字符数组char[]与字符串String之间互相转换

1.字符数组转为字符串 方法1&#xff1a;直接在构造String时转换。 char[] data {‘a’, ‘b’, ‘c’}; String str new String(data);方法2&#xff1a;调用String类的方法转换。 String s String.valueOf(char[] ch)2.字符串转为字符数组 情况一&#xff1a;如果是”a…

CentOS 7 Apache服务的安装与配置(转)

https://blog.51cto.com/13525470/2070375 一、Apache简介 Apache 是一个知名的开源Web服务器。早期的Apache服务器由Apache Group来维护&#xff0c;直到1999年6月Apache Group在美国德拉瓦市成立了非盈利性组织的公司&#xff0c;即Apache软件基金会&#xff08;Apache Softw…

第二十九期:全球首部AI交响变奏曲问世,AI技术应用再拓边界

人工智能技术&#xff0c;史上第一次升级到了复杂音乐的创作领域&#xff1a;交响曲。 全球首部 AI 交响变奏曲《我和我的祖国》&#xff0c;昨晚已由深圳交响乐团全球首演&#xff0c;它的出品方是中国平安人工智能研究院。 此前&#xff0c;你可能了解过 Google 的 Magenta、…

第三十期:BAT 为什么都看上了重庆?

一个城市朝向智能化创新的方向发展&#xff0c;一把手的重视是非常重要的。 文&#xff1a;I/O 重庆&#xff0c;作为我国中西部地区唯一的直辖市和国家中心城市&#xff0c;正在新一轮科技发展浪潮中扮演着越来越亮眼的角色。 尤其是近两个月来&#xff0c;重庆在推动科技创新…

第三十一期:世界上有四类人永远不可能成为编程界牛人(个人见解,欢迎补充)

本人歌谣&#xff0c;出来工作也有两年了。大学挂科无数&#xff0c;出来想搞技术。平时也就是以工作学习的知识为主&#xff0c;无聊的时候就会学习一些关于科技的知识。 在这本人给大家传授一些学习编程的心得体会&#xff0c;供大家分享交流&#xff1a; 1.没有专注力和恒心…

[Java]==和equals()的区别(按照数据类型区分)

背景知识 【引用类型】 复合数据类型是引用类型 **1.基本数据类型&#xff0c;也称原始数据类型。**byte,short,char,int,long,float,double,boolean 他们之间的比较&#xff0c;应用双等号&#xff08;&#xff09;,比较的是他们的值。 基本数据类型比较&#xff0c; 和 …

第三十二期:如何摆脱「技术思维」的惯性?

虽然从标题上看&#xff0c;这篇文章是写给“技术人”的&#xff0c;但 从广义上来说&#xff0c;只要你是一位以理性见长的人&#xff0c;那么这篇文章要讲的东西可能会与你有关。 虽然从标题上看&#xff0c;这篇文章是写给“技术人”的&#xff0c;但 从广义上来说&#xff…

[Leetcode][第207题][JAVA][课程表][拓扑排序][DFS]

【问题描述】[中等] 【解答思路】 1. 拓扑排序 复杂度分析 HashSet[] 数组 import java.util.HashSet; import java.util.LinkedList; import java.util.Queue;public class Solution {public boolean canFinish(int numCourses, int[][] prerequisites) {if (numCourses &l…

RabbitMQ(1) - win+rabbitMQ

rabbitMQ是一个在AMQP协议标准基础上完整的&#xff0c;可服用的企业消息系统。它遵循Mozilla Public License开源协议&#xff0c;采用 Erlang 实现的工业级的消息队列(MQ)服务器&#xff0c;Rabbit MQ 是建立在Erlang OTP平台上。 1.安装Erlang 所以在安装rabbitMQ之前&…

[周赛][Leetcode][第5457题][JAVA][动态规划][和为奇数的子数组数目]

【问题描述】5457. 和为奇数的子数组数目[中等] 【解答思路】 1. 动态规划 第 1 步&#xff1a;设计状态 dp[i][0] 记录以arr[i]结尾的和为奇数数量 dp[i][1] 记录以arr[i]结尾的和为偶数数量 第 2 步&#xff1a;状态转移方程 for(int i1;i<n;i){if(arr[i]%20){dp[i][0]…

第九期: 阿里巴巴程序员常用的15款开发者工具

阿里巴巴将自身在各类业务场景下的技术积淀&#xff0c;通过开源、云上实现或工具等形式对外开放&#xff0c;本文将精选了一些阿里巴巴的开发者工具&#xff0c;希望能帮助开发者们提高开发效率、更优雅的写代码。 从人工到自动化&#xff0c;从重复到创新&#xff0c;技术演进…

第三十三期:对于人工智能的恐惧及其5个解决方法

实施人工智能技术的IT领导人可能会感到一些恐惧&#xff0c;这有着充分的理由。人工智能在拥有数十年发展和应用历史的同时却有着奇怪的定位&#xff0c;但对于许多人来说&#xff0c;人工智能仍然是一种未来主义的感觉。 实施人工智能技术的IT领导人可能会感到一些恐惧&#x…

[Leetcode][第392题][JAVA][判断子序列][动态规划][双指针]

【问题描述】[简单] 【解答思路】 1. 双指针 时间复杂度&#xff1a;O(NM) 空间复杂度&#xff1a;O(1) class Solution { public:bool isSubsequence(string s, string t) {int n s.length(), m t.length();int i 0, j 0;while (i < n && j < m) {if (s[…

权限分配之权限的展示

最后就是权限的展示了&#xff1a;对前面的 总结&#xff1a;  1. 一级菜单列表&#xff0c;是我对 menu表的&#xff0c;增删改查。  2. 二级菜单列表&#xff0c;是我对Permission表中&#xff0c; 可以作为二级菜单存在&#xff0c;如 客户列表、账单列表的 增删改查  …

优先队列----堆

问题 打印机打印作业一般是放在队列中的。如果按照先来先打印的顺序&#xff0c;有一个100页的打印任务&#xff0c;那么会让后面短小的任务等待很长时间。更合理的做法也许是最后处理最耗时的打印任务&#xff0c;不管它是不是最后提交上来的。 在多用户操作系统中&#xff…