class070 子数组最大累加和问题与扩展-上【算法】

class070 子数组最大累加和问题与扩展-上【算法】

在这里插入图片描述

code1 53. 最大子数组和

// 累加和最大子数组和
// 给你一个整数数组 nums
// 请你找出一个具有最大累加和的非空子数组
// 返回其最大累加和
// 测试链接 : https://leetcode.cn/problems/maximum-subarray/

dp[i]:以i结尾的子数组[…i]的最大累加和
(1) nums[i] (2) dp[i-1]+nums[i] 二者取最大的
返回Max(dp[…])

code1 动态规划
code2 空间压缩

package class070;// 子数组最大累加和
// 给你一个整数数组 nums
// 返回非空子数组的最大累加和
// 测试链接 : https://leetcode.cn/problems/maximum-subarray/
public class Code01_MaximumSubarray {// 动态规划public static int maxSubArray1(int[] nums) {int n = nums.length;// dp[i] : 子数组必须以i位置的数做结尾,往左能延伸出来的最大累加和int[] dp = new int[n];dp[0] = nums[0];int ans = nums[0];for (int i = 1; i < n; i++) {dp[i] = Math.max(nums[i], dp[i - 1] + nums[i]);ans = Math.max(ans, dp[i]);}return ans;}// 空间压缩public static int maxSubArray2(int[] nums) {int n = nums.length;int ans = nums[0];for (int i = 1, pre = nums[0]; i < n; i++) {pre = Math.max(nums[i], pre + nums[i]);ans = Math.max(ans, pre);}return ans;}// 如下代码为附加问题的实现// 子数组中找到拥有最大累加和的子数组// 并返回如下三个信息:// 1) 最大累加和子数组的开头left// 2) 最大累加和子数组的结尾right// 3) 最大累加和子数组的累加和sum// 如果不止一个子数组拥有最大累加和,那么找到哪一个都可以public static int left;public static int right;public static int sum;// 找到拥有最大累加和的子数组// 更新好全局变量left、right、sum// 上游调用函数可以直接使用这三个变量// 相当于返回了三个值public static void extra(int[] nums) {sum = Integer.MIN_VALUE;for (int l = 0, r = 0, pre = Integer.MIN_VALUE; r < nums.length; r++) {if (pre >= 0) {// 吸收前面的累加和有利可图// 那就不换开头pre += nums[r];} else {// 吸收前面的累加和已经无利可图// 那就换开头pre = nums[r];l = r;}if (pre > sum) {sum = pre;left = l;right = r;}}}}

code2 198. 打家劫舍

// 数组中不能选相邻元素的最大累加和
// 给定一个数组,可以随意选择数字
// 但是不能选择相邻的数字,返回能得到的最大累加和
// 测试链接 : https://leetcode.cn/problems/house-robber/

dp[i]:表示[0…i]这个范围上不能选相邻元素的最大累加和

  1. 不要[i],dp[i-1]
  2. 要[i] a.nums[i] b.dp[i-2]+nums[i]

code1 动态规划
code2 空间压缩

package class070;// 数组中不能选相邻元素的最大累加和
// 给定一个数组,可以随意选择数字
// 但是不能选择相邻的数字,返回能得到的最大累加和
// 测试链接 : https://leetcode.cn/problems/house-robber/
public class Code02_HouseRobber {// 动态规划public static int rob1(int[] nums) {int n = nums.length;if (n == 1) {return nums[0];}if (n == 2) {return Math.max(nums[0], nums[1]);}// dp[i] : nums[0...i]范围上可以随意选择数字,但是不能选相邻数,能得到的最大累加和int[] dp = new int[n];dp[0] = nums[0];dp[1] = Math.max(nums[0], nums[1]);for (int i = 2; i < n; i++) {dp[i] = Math.max(dp[i - 1], Math.max(nums[i], dp[i - 2] + nums[i]));}return dp[n - 1];}// 空间压缩public static int rob2(int[] nums) {int n = nums.length;if (n == 1) {return nums[0];}if (n == 2) {return Math.max(nums[0], nums[1]);}int prepre = nums[0];int pre = Math.max(nums[0], nums[1]);for (int i = 2, cur; i < n; i++) {cur = Math.max(pre, Math.max(nums[i], prepre + nums[i]));prepre = pre;pre = cur;}return pre;}}

code3 918. 环形子数组的最大和

// 环形数组的子数组最大累加和
// 给定一个数组nums,长度为n
// nums是一个环形数组,下标0和下标n-1是连在一起的
// 返回环形数组中,子数组最大累加和
// 测试链接 : https://leetcode.cn/problems/maximum-sum-circular-subarray/

(1) 答案不被隔断,同1普通数组,最大累加和maxSum
(2) 答案被隔断,整体累加和all-最小累加和minSum
两者取较大即为答案

package class070;// 环形数组的子数组最大累加和
// 给定一个数组nums,长度为n
// nums是一个环形数组,下标0和下标n-1是连在一起的
// 返回环形数组中,子数组最大累加和
// 测试链接 : https://leetcode.cn/problems/maximum-sum-circular-subarray/
public class Code03_MaximumSumCircularSubarray {public static int maxSubarraySumCircular(int[] nums) {int n = nums.length, all = nums[0], maxsum = nums[0], minsum = nums[0];for (int i = 1, maxpre = nums[0], minpre = nums[0]; i < n; i++) {all += nums[i];maxpre = Math.max(nums[i], nums[i] + maxpre);maxsum = Math.max(maxsum, maxpre);minpre = Math.min(nums[i], nums[i] + minpre);minsum = Math.min(minsum, minpre);}// 1) maxsum// 2) all - minsumreturn all == minsum ? maxsum : Math.max(maxsum, all - minsum);}}

code4 213. 打家劫舍 II

// 环形数组中不能选相邻元素的最大累加和
// 给定一个数组nums,长度为n
// nums是一个环形数组,下标0和下标n-1是连在一起的
// 可以随意选择数字,但是不能选择相邻的数字
// 返回能得到的最大累加和
// 测试链接 : https://leetcode.cn/problems/house-robber-ii/

思路:
不要[0]位置 [1…n-1]
要[0]位置 nums[0] + [2…n-2]

package class070;// 环形数组中不能选相邻元素的最大累加和
// 给定一个数组nums,长度为n
// nums是一个环形数组,下标0和下标n-1是连在一起的
// 可以随意选择数字,但是不能选择相邻的数字
// 返回能得到的最大累加和
// 测试链接 : https://leetcode.cn/problems/house-robber-ii/
public class Code04_HouseRobberII {public static int rob(int[] nums) {int n = nums.length;if (n == 1) {return nums[0];}return Math.max(best(nums, 1, n - 1), nums[0] + best(nums, 2, n - 2));}// nums[l....r]范围上,没有环形的概念// 返回 : 可以随意选择数字,但不能选择相邻数字的情况下,最大累加和public static int best(int[] nums, int l, int r) {if (l > r) {return 0;}if (l == r) {return nums[l];}if (l + 1 == r) {return Math.max(nums[l], nums[r]);}int prepre = nums[l];int pre = Math.max(nums[l], nums[l + 1]);for (int i = l + 2, cur; i <= r; i++) {cur = Math.max(pre, nums[i] + Math.max(0, prepre));prepre = pre;pre = cur;}return pre;}}

code5 2560. 打家劫舍 IV

// 打家劫舍 IV
// 沿街有一排连续的房屋。每间房屋内都藏有一定的现金
// 现在有一位小偷计划从这些房屋中窃取现金
// 由于相邻的房屋装有相互连通的防盗系统,所以小偷不会窃取相邻的房屋
// 小偷的 窃取能力 定义为他在窃取过程中能从单间房屋中窃取的 最大金额
// 给你一个整数数组 nums 表示每间房屋存放的现金金额
// 第i间房屋中放有nums[i]的钱数
// 另给你一个整数k,表示小偷需要窃取至少 k 间房屋
// 返回小偷需要的最小窃取能力值
// 测试链接 : https://leetcode.cn/problems/house-robber-iv/

二分答案法
能力[min,max]有单调性
布尔函数判断能力值给定,是否能偷够k间

dp[i]:[0…i]范围上不偷相邻房间并且有能力要求的最大间数

不偷[i],dp[i-1]
能力大于[i],偷[i] dp[i-2]+1
偷不了[i] dp[i-2]

贪心优化:
能偷就偷,偷了就跳过,
尽早偷,留下更大的区间

code1 动态规划
code2 空间压缩
code3 贪心优化

package class070;// 打家劫舍 IV
// 沿街有一排连续的房屋。每间房屋内都藏有一定的现金
// 现在有一位小偷计划从这些房屋中窃取现金
// 由于相邻的房屋装有相互连通的防盗系统,所以小偷不会窃取相邻的房屋
// 小偷的 窃取能力 定义为他在窃取过程中能从单间房屋中窃取的 最大金额
// 给你一个整数数组 nums 表示每间房屋存放的现金金额
// 第i间房屋中放有nums[i]的钱数
// 另给你一个整数k,表示小偷需要窃取至少 k 间房屋
// 返回小偷需要的最小窃取能力值
// 测试链接 : https://leetcode.cn/problems/house-robber-iv/
public class Code05_HouseRobberIV {public static int minCapability(int[] nums, int k) {int n = nums.length, l = nums[0], r = nums[0];for (int i = 1; i < n; i++) {l = Math.min(l, nums[i]);r = Math.max(r, nums[i]);}// l....rint m, ans = 0;while (l <= r) {m = (l + r) / 2;if (mostRob1(nums, n, m) >= k) {ans = m;r = m - 1;} else {l = m + 1;}}return ans;}// 盗贼能力为ability时// 返回盗贼最多能窃取多少间房屋// 注意限制 : 不能窃取相邻房屋public static int mostRob1(int[] nums, int n, int ability) {if (n == 1) {return nums[0] <= ability ? 1 : 0;}if (n == 2) {return (nums[0] <= ability || nums[1] <= ability) ? 1 : 0;}int[] dp = new int[n];dp[0] = nums[0] <= ability ? 1 : 0;dp[1] = (nums[0] <= ability || nums[1] <= ability) ? 1 : 0;for (int i = 2; i < n; i++) {dp[i] = Math.max(dp[i - 1], (nums[i] <= ability ? 1 : 0) + dp[i - 2]);}return dp[n - 1];}// 继续空间压缩优化public static int mostRob2(int[] nums, int n, int ability) {if (n == 1) {return nums[0] <= ability ? 1 : 0;}if (n == 2) {return (nums[0] <= ability || nums[1] <= ability) ? 1 : 0;}int prepre = nums[0] <= ability ? 1 : 0;int pre = (nums[0] <= ability || nums[1] <= ability) ? 1 : 0;for (int i = 2, cur; i < n; i++) {cur = Math.max(pre, (nums[i] <= ability ? 1 : 0) + prepre);prepre = pre;pre = cur;}return pre;}// 继续贪心优化public static int mostRob3(int[] nums, int n, int ability) {int ans = 0;for (int i = 0; i < n; i++) {if (nums[i] <= ability) {ans++;i++;}}return ans;}}

code6 面试题 17.24. 最大子矩阵

// 子矩阵最大累加和问题
// 给定一个二维数组grid,找到其中子矩阵的最大累加和
// 返回拥有最大累加和的子矩阵左上角和右下角坐标
// 如果有多个子矩阵都有最大累加和,返回哪一个都可以
// 测试链接 : https://leetcode.cn/problems/max-submatrix-lcci/

package class070;import java.util.Arrays;// 子矩阵最大累加和问题
// 给定一个二维数组grid,找到其中子矩阵的最大累加和
// 返回拥有最大累加和的子矩阵左上角和右下角坐标
// 如果有多个子矩阵都有最大累加和,返回哪一个都可以
// 测试链接 : https://leetcode.cn/problems/max-submatrix-lcci/
public class Code06_MaximumSubmatrix {// 如果行和列的规模都是n,时间复杂度O(n^3),最优解了public static int[] getMaxMatrix(int[][] grid) {int n = grid.length;int m = grid[0].length;int max = Integer.MIN_VALUE;int a = 0, b = 0, c = 0, d = 0;int[] nums = new int[m];for (int up = 0; up < n; up++) {Arrays.fill(nums, 0);for (int down = up; down < n; down++) {// 如下代码就是题目1的附加问题 :// 子数组中找到拥有最大累加和的子数组for (int l = 0, r = 0, pre = Integer.MIN_VALUE; r < m; r++) {nums[r] += grid[down][r];if (pre >= 0) {pre += nums[r];} else {pre = nums[r];l = r;}if (pre > max) {max = pre;a = up;b = l;c = down;d = r;}}}}return new int[] { a, b, c, d };}}

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

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

相关文章

【Docker】Docker Compose,yml 配置指令参考的详细讲解

作者简介&#xff1a; 辭七七&#xff0c;目前大二&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; 七七的闲谈 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f…

基于c++版数据结构基于数组栈改-Python思维总结

##栈部分-&#xff08;叠猫猫&#xff09; ##抽象数据类型栈的定义&#xff1a;是一种遵循先入后出的逻辑的线性数据结构。 换种方式去理解这种数据结构如果我们在一摞盘子中取到下面的盘子&#xff0c;我们首先要把最上面的盘子依次拿走&#xff0c;才可以继续拿下面的盘子&…

【Java期末复习资料】(2)常见例题 //持续更新

本文章主要是常见例题&#xff0c;解析不会太详细&#xff0c;有问题、不会的可以给我发消息哦&#xff0c;后续会出模拟卷 常见例题&#xff1a; 1.下列跟Java技术平台有关的是&#xff08;ABD&#xff09; A.JVM B.JDK C.JPN D.JRE 2.面向对象的特征包括&#xff08;ACD&…

wxPython的控件tree

wxPython树控件介绍 树&#xff08;tree&#xff09;是一种通过层次结构展示信息的控件&#xff0c;如下图所示是树控件示例&#xff0c;左窗口中是树控件&#xff0c;在wxPython中树控件类是wx.TreeCtrl。 wx.TreeCtrl常用的方法有 AddRoot(text, image-1, selImage-1, data…

在Deepin中安装x11vnc工具并结合内网穿透软件实现远程访问桌面

文章目录 1. 安装x11vnc2. 本地远程连接测试3. Deepin安装Cpolar4. 配置公网远程地址5. 公网远程连接Deepin桌面6. 固定连接公网地址7. 固定公网地址连接测试 x11vnc是一种在Linux系统中实现远程桌面控制的工具&#xff0c;它的原理是通过X Window系统的协议来实现远程桌面的展…

P4 Qt如何添加qss样式表文件和添加图片资源

目录 前言 01 添加图片资源文件 02 添加qss文件 前言 &#x1f3ac; 个人主页&#xff1a;ChenPi &#x1f43b;推荐专栏1: 《C_ChenPi的博客-CSDN博客》✨✨✨ &#x1f525; 推荐专栏2: 《Qt基础_ChenPi的博客-CSDN博客》✨✨✨ &#x1f33a;本篇简介 &#xff1a;这一章…

JVM Optimization Learning(六)

目录 一、JVM Optimization 1、Shenandoah Shenandoah的使用方法 2、ZGC ZGC的版本更迭 ZGC的使用方法 ZGC的参数设置 3、JMH测试GC性能 一、JVM Optimization 1、Shenandoah Shenandoah是由Red Hat开发的一款低延迟的垃圾收集器&#xff0c;Shenandoah并发执行大部分…

机器人纯阻抗控制接触刚性环境(阻尼影响因素)

问题描述 在机器人学中&#xff0c;阻抗控制是一种常用的控制策略&#xff0c;用于管理机器人在与环境交互时的运动和力。阻抗控制背后的关键概念是将环境视为导纳&#xff0c;而将机器人视为阻抗。 纯阻抗控制接触刚性环境时&#xff0c;机器人的行为方式主要受其阻抗参数的…

【开源】基于Vue和SpringBoot的车险自助理赔系统

项目编号&#xff1a; S 018 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S018&#xff0c;文末获取源码。} 项目编号&#xff1a;S018&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 角色管理模块2.3 车…

Maven基础

目录 Maven坐标 坐标简介 主要组成 Maven依赖管理 配置依赖 依赖简介 配置依赖 依赖传递 依赖传递简介 排除依赖 依赖范围 生命周期 生命周期简介 执行指定生命周期 Maven坐标 坐标简介 Maven中的坐标是资源的唯一标识&#xff0c;通过该坐标可以唯一定位资…

Python开发运维:Python调用K8S API实现资源管理

目录 一、实验 1.Python操作K8S API获取资源 2.Python操作K8S API创建deployment资源 3.Python操作K8S API删除k8s资源 4.Python操作K8S API修改k8s资源 5.Python操作K8S API查看k8s资源 二、问题 1.Windows11安装kubernetes报错 2.Python通过调用哪些方法实现Pod和De…

在SpringData JPA 中实现对持久层的操作

1.导入依赖 hibernate 这个依赖自带实现JPA接口 <dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><depen…

CrystalDiskInfo中文版(硬盘检测工具) v9.1.1.0 绿色汉化版-供大家学习研究参考

更新内容 重新支持三星SATA SSD寿命报告 增加对ZHITAI SC001的支持 新增SK hynix Gold S31支持 增加了KLEVV NEO N610的支持。 改进的Micron/Crucial SATA SSD支持 已更改 卸载程序将显示一个确认对话框&#xff0c;用于删除设置。 强大功能 1.拥有多国语言&#xff0c;…

045:Vue读取本地上传JSON文件,导出JSON文件方法

第045个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 &#xff08;1&#xff09;提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使…

jquery手写广告轮播图,无限循环功能

说明 在很多情况下&#xff0c;我们都需要开发广告轮播图&#xff0c;当我们进行页面的功能开发时&#xff0c;采用轮播图来实现也行&#xff0c;但是很多情况下&#xff0c;我们只需要简单的控制轮播循环轮播展示即可&#xff0c;所以用jq开开发广告轮播波&#xff0c;自定义…

Idea 插件开发: Swing Designer设计器创建的组件全部为空问题记录

问题现象 通过Swing 设计器创建的对象, Swing组件全部是空的, 导致ToolWindowFactory工厂的实现类调用时候出现了空指针异常 如下方式创建的 问题分析 问题出现时候, 同时给我生成了一个createUIComponents的私有方法, 由于个人当时理解有误, 把他当成了初始化方法, 在里面…

Oracle高可用一家老小全在这里

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

用Java实现一对一聊天

目录 服务端 客户端 服务端 package 一对一用户; import java.awt.BorderLayout; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; imp…

SpringBoot中MyBatis-Flex的集成和使用

一、MyBatis-Flex 是什么​ MyBatis-Flex是一个基于MyBatis的数据访问框架&#xff0c;专门为Flex应用程序而设计的。它提供了一种灵活而高效的方式来处理Flex应用程序中的数据访问&#xff0c;可以轻松地连接到各种数据源&#xff0c;并提供了一些方便的工具和功能&#xff0c…

delphi android打开外部文件,报错android.os.FileUriExposedException解决方法

Android 7.0强制启用了被称作 StrictMode的策略&#xff0c;带来的影响就是你的App对外无法暴露file://类型的URI了。 如果你使用Intent携带这样的URI去打开外部App(比如&#xff1a;打开系统相机拍照)&#xff0c;那么会抛出FileUriExposedException异常。 Delphi 为Android…