【优选算法】(第十六篇)

news2024/10/3 4:51:20

目录

连续数组(medium)

题目解析

讲解算法原理

编写代码

矩阵区域和(medium)

题目解析

讲解算法原理

编写代码


连续数组(medium)

题目解析

1.题目链接:. - 力扣(LeetCode)

2.题目描述

给定⼀个⼆进制数组nums,找到含有相同数量的0和1的最⻓连续⼦数组,并返回该⼦数组的⻓度。
⽰例1:
输⼊:nums=[0,1]输出:2
说明:
[0,1]是具有相同数量0和1的最⻓连续⼦数组。⽰例2:
输⼊:nums=[0,1,0]输出:2
说明:
[0,1](或[1,0])是具有相同数量0和1的最⻓连续⼦数组。
提⽰:
1<=nums.length<=10^5
nums[i]不是0就是1

讲解算法原理

暴⼒解法就是枚举所有的⼦数组,然后判断⼦数组是否满⾜要求,这⾥不再赘述。)

 解法(前缀和在哈希表中):
算法思路:
稍微转化⼀下题⽬,就会变成我们熟悉的题:
• 本题让我们找出⼀段连续的区间, 0 和 1 出现的次数相同。
• 如果将 0 记为 -1 , 1 记为 1 ,问题就变成了找出⼀段区间,这段区间的和等于 0 。
• 于是,就和560.和为K的⼦数组这道题的思路⼀样


设 i 为数组中的任意位置,⽤ sum[i] 表⽰ [0, i] 区间内所有元素的和。
想知道最⼤的「以 i 为结尾的和为 0 的⼦数组」,就要找到从左往右第⼀个 x1 使得 [x1, i] 区间内的所有元素的和为 0 。那么 [0, x1 - 1] 区间内的和是不是就是 sum[i] 了。于是问题就变成:
• 找到在 [0, i - 1] 区间内,第⼀次出现 sum[i] 的位置即可。
我们不⽤真的初始化⼀个前缀和数组,因为我们只关⼼在 i 位置之前,第⼀个前缀和等于 sum[i] 的位置。因此,我们仅需⽤⼀个哈希表,⼀边求当前位置的前缀和,⼀边记录第⼀次出现该前缀和的位置。

编写代码

c++算法代码:

class Solution
{
public:
 int findMaxLength(vector<int>& nums) 
 {
 unordered_map<int, int> hash;
 hash[0] = -1; // 默认有⼀个前缀和为 0 的情况
 int sum = 0, ret = 0;
 for(int i = 0; i < nums.size(); i++)
 {
 sum += nums[i] == 0 ? -1 : 1; // 计算当前位置的前缀和
 if(hash.count(sum)) ret = max(ret, i - hash[sum]);
 else hash[sum] = i;
 }
 return ret;
 }
};

java算法代码:

class Solution {
 public int findMaxLength(int[] nums) {
 Map<Integer, Integer> hash = new HashMap<Integer, Integer>();
 hash.put(0, -1); // 默认存在⼀个前缀和为 0 的情况
 int sum = 0, ret = 0;
 for(int i = 0; i < nums.length; i++)
 {
 sum += (nums[i] == 0 ? -1 : 1); // 计算当前位置的前缀和
 if(hash.containsKey(sum)) ret = Math.max(ret, i - hash.get(sum));
 else hash.put(sum, i);
 }
 return ret;
 }
}

 

矩阵区域和(medium)

题目解析

1.题目链接:. - 力扣(LeetCode)

2.题目描述

给你⼀个mxn的矩阵mat和⼀个整数k,请你返回⼀个矩阵answer,其中每个answer[i][j]是所有满⾜下述条件的元素mat[r][c]的和:
• i-k<=r<=i+k,
• j-k<=c<=j+k且
• (r,c)在矩阵内。

⽰例1:
输⼊:mat=[[1,2,3],[4,5,6],[7,8,9]],k=1
输出:[[12,21,16],[27,45,33],[24,39,28]]
⽰例2:
输⼊:mat=[[1,2,3],[4,5,6],[7,8,9]],k=2
输出:[[45,45,45],[45,45,45],[45,45,45]]

提⽰:
m==mat.length
n==mat[i].length
1<=m,n,k<=100
1<=mat[i][j]<=100

讲解算法原理

解法:
算法思路:
⼆维前缀和的简单应⽤题,关键就是我们在填写结果矩阵的时候,要找到原矩阵对应区域的「左上⻆」以及「右下⻆」的坐标(推荐⼤家画图)
左上⻆坐标: x1 = i - k,y1 = j - k ,但是由于会「超过矩阵」的范围,因此需要对 0 取⼀个 max 。因此修正后的坐标为: x1 = max(0, i - k), y1 = max(0, j - k) ;
右下⻆坐标: x1 = i + k,y1 = j + k ,但是由于会「超过矩阵」的范围,因此需要对 m - 1 ,以及 n - 1 取⼀个 min 。因此修正后的坐标为: x2 = min(m - 1, i + k), 
y2 = min(n - 1, j + k) 。
然后将求出来的坐标代⼊到「⼆维前缀和矩阵」的计算公式上即可~(但是要注意下标的映射关系)

编写代码

c++算法代码:

class Solution {
public:
 vector<vector<int>> matrixBlockSum(vector<vector<int>>& mat, int k) {
 int m = mat.size(), n = mat[0].size();
 vector<vector<int>> dp(m + 1, vector<int>(n + 1));
 // 1. 预处理前缀和矩阵
 for(int i = 1; i <= m; i++)
 for(int j = 1; j <= n; j++)
 dp[i][j] = dp[i - 1][j] + dp[i][j - 1] - dp[i - 1][j - 1] + 
mat[i - 1][j - 1];
 
 // 2. 使⽤
 vector<vector<int>> ret(m, vector<int>(n));
 for(int i = 0; i < m; i++)
 for(int j = 0; j < n; j++)
 {
 int x1 = max(0, i - k) + 1, y1 = max(0, j - k) + 1;
 int x2 = min(m - 1, i + k) + 1, y2 = min(n - 1, j + k) + 1;
 ret[i][j] = dp[x2][y2] - dp[x1 - 1][y2] - dp[x2][y1 - 1] + 
dp[x1 - 1][y1 - 1];
 }
 
 return ret;
 }
};

java算法代码:

class Solution {
 public int[][] matrixBlockSum(int[][] mat, int k) {
 int m = mat.length, n = mat[0].length;
 // 1. 预处理前缀和矩阵
 int[][] dp = new int[m + 1][n + 1];
 for(int i = 1; i <= m; i++)
 for(int j = 1; j <= n; j++)
 dp[i][j] = dp[i - 1][j] + dp[i][j - 1] - dp[i - 1][j - 1] + 
mat[i - 1][j - 1];
 
 // 2. 使⽤
 int[][] ret = new int[m][n];
 for(int i = 0; i < m; i++)
 for(int j = 0; j < n; j++)
 {
 int x1 = Math.max(0, i - k) + 1, y1 = Math.max(0, j - k) + 1;
 int x2 = Math.min(m - 1, i + k) + 1, y2 = Math.min(n - 1, j + 
k) + 1;
 ret[i][j] = dp[x2][y2] - dp[x1 - 1][y2] - dp[x2][y1 - 1] + 
dp[x1 - 1][y1 - 1];
 }
 return ret;
 }
}

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

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

相关文章

【重学 MySQL】五十一、更新和删除数据

【重学 MySQL】五十一、更新和删除数据 更新数据删除数据注意事项 在MySQL中&#xff0c;更新和删除数据是数据库管理的基本操作。 更新数据 为了更新&#xff08;修改&#xff09;表中的数据&#xff0c;可使用UPDATE语句。UPDATE语句的基本语法如下&#xff1a; UPDATE ta…

前端学习第二天笔记 CSS选择 盒子模型 浮动 定位 CSS3新特性 动画 媒体查询 精灵图雪碧图 字体图标

CSS学习 CSS选择器全局选择器元素选择器类选择器ID选择器合并选择器 选择器的优先级字体属性背景属性文本属性表格属性表格边框折叠边框表格文字对齐表格填充表格颜色 关系选择器后代选择器子代选择器相邻兄弟选择器通用兄弟选择器 CSS盒子模型弹性盒子模型父元素上的属性flex-…

Linux 安装 yum

第一步&#xff1a;下载安装包 这里以 CentOS 7 为例 wget https://vault.centos.org/7.2.1511/os/x86_64/Packages/yum-3.4.3-132.el7.centos.0.1.noarch.rpm wget https://vault.centos.org/7.2.1511/os/x86_64/Packages/yum-metadata-parser-1.1.4-10.el7.x86_64.rpm wget…

计算机网络(十) —— IP协议详解,理解运营商和全球网络

目录 一&#xff0c;关于IP 1.1 什么是IP协议 1.2 前置认识 二&#xff0c;IP报头字段详解 三&#xff0c;网段划分 3.1 IP地址的构成 3.2 网段划分 3.3 子网划分 3.4 IP地址不足问题 四&#xff0c;公网IP和私有IP 五&#xff0c;理解运营商和全球网络 六&#xff…

硬件面试(一)

网上别人的硬件面试记录&#xff0c;察漏补缺&#xff1a; 1.骄傲容易被打脸&#xff01; 励磁电感和谐振电感的比值K大小有什么含义: 励磁电感和谐振电感的比值 KKK 通常用来衡量电路的特性。当 KKK 较大时&#xff0c;表示励磁电感相对于谐振电感较强&#xff0c;可能导致…

力扣题解1870

这道题是一个典型的算法题&#xff0c;涉及计算在限制的时间内列车速度的最小值。这是一个优化问题&#xff0c;通常需要使用二分查找来求解。 题目描述&#xff08;中等&#xff09; 准时到达的列车最小时速 给你一个浮点数 hour &#xff0c;表示你到达办公室可用的总通勤时…

基于SSM的坚果金融投资管理系统、坚果金融投资管理平台的设计与开发、智慧金融投资管理系统的设计与实现、坚果金融投资管理系统的设计与应用研究(源码+定制+开发)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

如何在 Kubernetes 集群中安装和配置 OpenEBS 持久化块存储?

在 Kubernetes 集群中安装和配置 OpenEBS 持久化块存储是一项常见的任务&#xff0c;特别是在需要提供高可用和动态扩展的存储解决方案时。OpenEBS 是一个基于容器的存储解决方案&#xff0c;它允许你在 Kubernetes 集群中实现持久化存储卷&#xff08;Persistent Volumes&…

Microsoft 发布 PyRIT - 生成式 AI 的红队工具

微软发布了一个名为PyRIT&#xff08;Python风险识别工具的缩写&#xff09;的开放访问自动化框架&#xff0c;用于主动识别生成式人工智能&#xff08;AI&#xff09;系统中的风险。 这个红队工具旨在“使全球的每个组织都能够负责任地利用最新的人工智能进步进行创新”&…

ros2 自定义工作空间添加source

新建一个工作空间&#xff1a;ros2 create pkg~~~~~~~~~~~~ colcon build之后 &#xff0c;在install文件夹里面有一个 setup,bash文件 将这个文件添加到 bashrc gedit .bashrc 这样 在一个新终端中可以直接运行ros2 run package name &#xff08;包名&#xff09; 可执行…

消息中间件---初识(Kafka、RocketMQ、RabbitMQ、ActiveMQ、Redis)

1. 简介 消息中间件是一种支撑性软件系统&#xff0c;它在网络环境中为应用系统提供同步或异步、可靠的消息传输。消息中间件利用高效可靠的消息传递机制进行与平台无关的数据交流&#xff0c;并基于数据通信来进行分布式系统的集成。它支持多种通信协议和数据格式&#xff0c;…

CompletableFuture常用方法

一、获得结果和触发计算 1.获取结果 &#xff08;1&#xff09;public T get() public class CompletableFutureAPIDemo{public static void main(String[] args) throws ExecutionException, InterruptedException{CompletableFuture<String> completableFuture Com…

OpenAI 推理模型 O1 研发历程:团队访谈背后的故事

在 2024 年&#xff0c;OpenAI 推出了具有突破性推理能力的 O1 模型&#xff0c;自发布以来&#xff0c;这款新型 AI 模型引发了技术界的广泛关注。与 GPT-4 等大语言模型不同&#xff0c;O1 不仅具备处理复杂问题的能力&#xff0c;还能模拟人类思考过程&#xff0c;从而提高推…

告别 backtrader!换这个库实施量化回测

作者:老余捞鱼 原创不易,转载请标明出处及原作者。 写在前面的话: 在算法交易的领域,拥有一个强大的回测和策略分析工具至关重要。Vectorbt 已成为最有效且多功能的 Python 库之一。这款开源工具允许交易者在历史数据上测试策略、优化参数,并进行详尽的投资组合和风…

差分(续前缀和)(含一维二维)

题目引入 开发商小 Q 买下了一条街&#xff0c;他想在这条街的一边盖房子。 街道可以抽象为一条数轴&#xff0c;而小 Q 只会在坐标在 1~n 的范围内盖房子。 首先&#xff0c;小 Q 将街上坐标在 1∼ &#x1d45b;1∼ n 范围内的物体全部铲平。也就是说&#xff0c;在正式动工盖…

Kubernetes环境搭建

华子目录 Kubernetes部署说明环境准备工作主机准备harbor搭建k8s集群中的主机名和ip设定k8s集群中设置hosts解析k8s中的所有节点关闭防火墙和selinuxk8s集群中禁用swap分区k8s集群中安装docker-cek8s集群中下载harbor证书k8s集群中配置harbor镜像加速器 k8s节点登录harbor测试 …

当人工智能拥抱餐饮业,传统与创新的交融

大家好&#xff0c;我是Shelly&#xff0c;一个专注于输出AI工具和科技前沿内容的AI应用教练&#xff0c;体验过300款以上的AI应用工具。关注科技及大模型领域对社会的影响10年。关注我一起驾驭AI工具&#xff0c;拥抱AI时代的到来。 今天我们要聊一个充满烟火气的行业&#x…

C++进阶知识 AVL树实现

AVL树 1. AVL的概念2. AVL树的实现2.1 AVL树的结构2.2 AVL树的插⼊2.2.1 AVL树插⼊⼀个值的⼤概过程2.2.2 平衡因⼦更新 2.3 旋转2.3.1 旋转的原则2.3.2 右单旋2.3.4 左单旋2.3.5 左右双旋 3.代码实现 1. AVL的概念 • AVL树是最先发明的⾃平衡⼆叉查找树&#xff0c;AVL是⼀颗…

Linux Debian12使用Podman安装bwapp靶场环境

一、bwapp简介 bWAPP&#xff08;buggy Web Application&#xff09;是一个开源的、故意设计有漏洞的Web应用程序&#xff0c;旨在帮助安全爱好者、开发人员和学生发现和防止Web漏洞。它包含了超过100种不同的漏洞&#xff0c;涵盖了所有主要的已知Web漏洞。 二、bwapp下载 …

C++系列-多态

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 多态 多态就是不同类型的对象&#xff0c;去做同一个行为&#xff0c;但是产生的结果是不同的。 比如说&#xff1a; 都是动物叫声&#xff0c;猫是喵喵&#xff0c;狗是汪汪&am…