前缀和算法:提升编程效率的秘密武器(Java版)

本篇会加入个人的所谓鱼式疯言

❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言
而是理解过并总结出来通俗易懂的大白话,
小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的.
🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人能接受我们这个概念 !!!

在这里插入图片描述

前言

在前面我们熟悉了 == “双指针” 算法== ,== “滑动窗口” 算法==, 以及 二分查找 算法 。 小伙伴可以思考下,

这些本质上是不是都是双指针呢, 没错,当然是的 💖 💖 💖

这三个专题我们已经 圆满结束啦, 那么我们的双指针大家族也算是告一段落啦 💖 💖 💖

而在本篇我们中讲新的专题,是去双指针不同的专题 , 前缀和 算法

下面小伙伴先了解下本篇文章的规划吧 😊 😊 😊

目录

  1. 前缀和算法的初识

  2. 前缀和算法的实际运用

  3. 前缀和算法的总结

一. 前缀和算法的初识

<1>. 前缀和算法的简介

前缀和算法,也称为 前缀和技巧 ,是一种常见的算法技巧,用于高效地计算数组或序列中某个 位置前所有元素的和

前缀和算法的思路是先计算出从数组的 起始位置到每个位置子数组和 ,然后根据需要的范围计算出相应的结果。

<2>. 前缀和使用流程

我们通过一个简单的题目来讲解前缀和的具体使用吧 💖 💖 💖 💖

1. 前缀和

DP34.前缀和题目链接

<1>. 题目描述

在这里插入图片描述

题目含义

初始化一个数组,并 指定长度,然后在指定一段需要求的 子数组的区间总和 ,进行返回, 注意这里要指定 q 次, 意味着我们要求 q 次子数组的总和 并返回

<2>. 讲解算法思想

题目分析

遇到求某段区间的总和,我们不难想到

解法一 :

暴力求解

用一个 for 循环 来累加 左右区间 的,然后循环往复进步 q

前缀和算法 :

我们先定义一个 数组dp,这个数组是主要用来统计 i 位置到 0 的 元素的 总和

算法步骤

在这里插入图片描述

  • 第一步: 先定义 dp 数组, i = 0 时,先把 第一个元素 进行 相加, 然后到 i = 1 时,我们就在 dp[0] 的基础上加上 原数组(假设原数组名为 nums ) nums[1] 那个元素 , 循环往复,意味着就可以得到我们的 每个位置到 0 位置的总和的数据

在这里插入图片描述

  • 第二步: 使用前缀和数组,我们要得到某得区间的,就可以利用前缀和数组,用 dp[右边界] - dp[左边界-1] 就可以得到我们的该 区间的和

请添加图片描述

<3>. 编写代码

import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);int n=in.nextInt();int q=in.nextInt();long [] array=new long [n+1];for(int i =1 ; i < n+1 ; ++i) {array[i]=in.nextInt();      }int k=0;long[] sum=new long[q];long[] dp=new long[n+1];dp[0]=0;for(int x= 1; x < n+1 ; x++ ) {dp[x]= dp[x-1] + array[x];}while(q != 0) {int left = in.nextInt();int right = in.nextInt();System.out.println(dp[right]-dp[left-1]);                k++;q--;}}}

在这里插入图片描述

鱼式疯言

前缀和算法的时间复杂度为 O(n) ,其中 n 表示数组的长度。

它的主要应用场景包括计算 连续子数组的和 、找到和为某个特定值的 子数组等

细节处理

 dp[0]=0;

我们这里就直接放置 下标 0 的位置为 0 ,这样就可以 有序的进行循环 dp[i]= dp[i-1] +array[i];

在这里插入图片描述

因为当 i=0 i-1 就很有可能 发生越界

二. 前缀和的实际运用

1. 除自身以外的乘积

238.除自身以外的乘积题目链接

<1>. 题目描述

在这里插入图片描述

给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。

题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。

请 不要使用除法,且在 O(n) 时间复杂度内完成此题。

示例 1:

输入: nums = [1,2,3,4]
输出: [24,12,8,6]

示例 2:

输入: nums = [-1,1,0,-3,3]
输出: [0,0,9,0,0]

题目含义

定义一个新数组,求 nums 除了该 位置以外元素乘积,并赋值给新数组的 当前位置

<2>. 讲解算法思想

题目分析 :

因为题目要求我们不能使用 除法

所以就要利用 前缀积 算法, 并且使用 前缀积后缀积 结合起来去解决本题

在这里插入图片描述

算法步骤

首先我们需要两个数组一个是前缀积 dpleft 和 dpright ;来 ( 同一下标) 初始化我们的 前缀积 以及 后缀积

当我们定义 前缀积 时 :

下标 0 开始 从左往右 累加 dp[i]= dp[i-1] * nums[i-1] 初始化 deleft数组

请添加图片描述

当我们定义 后缀积derightnums最后一个数组 从右往左 开始 (同一下标) dp[i] = dp[i + 1] * nums[i + 1] 来初始化 后缀和deright

请添加图片描述

最后我们要获取到该位置的值就可以 通过 ret[i]= dpleft[i] * dpright[i+1]; 来获取当前位置除自身以外的 乘积

<3>. 编写代码

class Solution {public int[] productExceptSelf(int[] nums) {// 得到数组长度int n= nums.length;// 定义一个前缀积的数组int[] dpleft = new int [n+1];dpleft[0]= 1;// 进行前缀积for(int i =1 ; i < n+1 ; ++i) {dpleft[i]=nums[i-1] * dpleft[i-1];}  // 定义 一个后缀积的数组int[] dpright= new int[n+1];dpright[n]=1;// 进行后缀积的数组for(int  j = n-1 ; j >= 0; j-- ) {dpright[j]= nums[j] * dpright[j+1];}int[] ret= new int[n];// 得到返回值for(int i =0 ; i < n; ++i) {ret[i]= dpleft[i] * dpright[i+1];}return ret;}
}

在这里插入图片描述

鱼式疯言

本题的一点体会

本题的核心是如何写出 前缀积数组后缀积的数组 的递推公式, 以及边界值的处理细节

边界处理细节

  // 定义一个前缀积的数组int[] dpleft = new int [n+1];dpleft[0]= 1;// 定义 一个后缀积的数组int[] dpright= new int[n+1];dpright[n]=1;

定义一个比一个原来的数组的长度 +1dp数组,并且把 最边界 都赋值为 1 (注意是 1, 而不是为 0 )

2. 和可被 k 整除的子数组

974. 和可被 k 整除的子数组题目链接

<1>. 题目描述

在这里插入图片描述

给定一个整数数组 nums 和一个整数 k ,返回其中元素之和可被 k 整除的(连续、非空) 子数组 的数目。

子数组 是数组的 连续 部分。

示例 1:

输入:nums = [4,5,0,-2,-3,1], k = 5
输出:7
解释:
有 7 个子数组满足其元素之和可被 k = 5 整除:
[4, 5, 0, -2, -3, 1], [5], [5, 0], [5, 0, -2, -3], [0], [0, -2, -3], [-2, -3]

示例 2:

输入: nums = [5], k = 9
输出: 0

题目含义

返回一段的所有能够被 k 整除子数组个数

<2>. 讲解算法思想

解法一:

暴力枚举

解法二:

前缀和

讲解 前缀和算法 之前,我们先得熟悉 两个原理

1. 同余定理

如果 (a - b) % n == 0 ,那么我们可以得到一个结论: a % n == b % n

用文字叙述就是,如果 两个数相减的差能被 n 整除 ,那么这两个数对 n 取模结果相同

例如: ·(26 - 2) % 12 == 0 ,那么 26 % 12 == 2 % 12 == 2

在这里插入图片描述

2. java 中负数取模的处理方法

a. Java 中关于负数的取模运算,结果是**「把负数当成正数,取模之后的结果加上一个负号」。**

例如: -1 % 3 = -(1 % 3) = -1

b. 因为有负数,为了防止发生 「出现负数」 的结果,以 (a % n + n) % n 的形式输出 保证为正

例如: -1 % 3 = (-1 % 3 + 3) % 3 = 2

在这里插入图片描述

前缀和算法步骤

  • 设 i 为数组中的任意位置,用 sum[i] 表示 [0, i] 区间内所有元素的和。

  • 想知道有多少个「以 i 为结尾的可被 k 整除的子数组」,就要找到有多少个起始位置为 x1, x2 , x3 … 使得 [x, i] 区间内的所有元素的和可被 k 整除。

  • [0, x - 1] 区间内所有元素之和等于 a[0, i] 区间内所有元素的和等于 b ,可得 (b - a) % k == 0

  • 同余定理 可得, [0, x - 1] 区间与 [0, i] 区间内的前缀和同余。于是问题就变成:

  • 找到在 [0, i - 1] 区间内,有多少前缀和的余数等于 sum [i] % k 的即可。

在这里插入图片描述

  1. 我们先定义一个 哈希表 来统计每次 前缀和的个数 , 并且寻找中间到是否 前缀和 中是否出现的 个数
  1. 然后我们就可以通过哈希表来寻找满足 sum[i] % k 的 个数

请添加图片描述

<3>. 编写代码


class Solution {public int subarraysDivByK(int[] nums, int k) {// 定义 一个哈希表Map<Integer, Integer> map= new HashMap<>();int n= nums.length;int ret=0,sum=0;// 可以理解为 从 0 位置放入 0 数据 map.put(0/k,1);for(int i=0; i < n; ++i ) {sum += nums[i];// 除去 Java 中 取模是 负数的情况int r=  (sum % k + k) % k  ;// 通过 余值定理 可知// sum % k =   a  % k// 这里就可以转化成 前面 【0, i-1】的位置 // 是否存在 哈希表中ret += map.getOrDefault(r,0);// 将前缀和数据放入 哈希表中map.put(r,map.getOrDefault(r,0)+1);}return ret;}
}

在这里插入图片描述

鱼式疯言

对于本题小编最大的体会

  1. 当我们需要求 某个数 的子数组 时, 借用 前缀和哈希表 的结合来寻找 前面的出现的 前缀和查找是否满足 该数字 的方法
   // 可以理解为 从 0 位置放入 0 数据 map.put(0/k,1);
  1. 细节处理

如果整段数值 前缀和为0 , 那么我们就需要制定一个 默认值0 来进入哈希表

3. 连续数组

525.连续数组题目链接

<1>. 题目描述

在这里插入图片描述

给定一个二进制数组 nums , 找到含有相同数量的 01最长连续子数组,并返回该 子数组 的长度。

示例 1:

输入: nums = [0,1]
输出: 2
说明: [0, 1] 是具有相同数量 0 和 1 的最长连续子数组。

示例 2:

输入: nums = [0,1,0]
输出: 2
说明: [0, 1] (或 [1, 0]) 是具有相同数量0和1的最长连续子数组。

题目含义 :

寻找 一个 最长的连续子数组 01 个想等的 长度

<2>. 讲解算法思想

题目分析

我们要 0 和 1 的个数想等, 那么我们确定 0 和 1 的个数想等呢 ?

我们可以思考一下, 如果 把 0 改成 -1 , 只要 -11 相加 为 0 不就 个数相等 了吗? 🤔 🤔 🤔

算法步骤

从上一题的思路可得, 我们的目的就是要寻找 总和 为 0 的 一段子数组, 我们就可以借助 哈希表 和 前缀和

在这里插入图片描述

那么我们本质上还是寻找 在现有的一段前缀和中去寻找一段区间是否 等于 0 的个数

我们先定义一个 哈希表, 因为我们要的长度, 但这个哈希表统计的是当前位置的下标

在这里插入图片描述

<3>. 编写代码

class Solution {public int findMaxLength(int[] nums) {int n= nums.length;// 定义个哈希表 // 左边为前缀和 , 右边 为 下标位置Map<Integer , Integer> map= new HashMap<>();int len=0,sum = 0;map.put(0,-1);// 前缀和 + 哈希表for(int j=0; j < n ; j++) {// 进行前缀和   sum +=  (nums[j]==0 ? -1 : 1) ;// 这个本质上还是相当于 用 getOrdefault() 来判断// 更新结果if(map.containsKey(sum)) {len=Math.max(len,j - map.get(sum) );} else {// 如果不存在该前缀和 就 进行哈希表// 这里的细节就是 // 不需要进入重复元素map.put(sum,j);}}return len;}
}

在这里插入图片描述

鱼式疯言

对于本题小编最大的体会还是 0 转 -1 从而 转化 成 总数为 0 这个思路

但核心还是我们的 前缀和+哈希表 来寻找我们一段子数组 中和 为 某个数 的方法

细节处理

细节一

   map.put(0,-1);

定义一个 初始下标为 -1 , 方便我们计算数组的 长度,并处理 边界条件

// 更新结果if(map.containsKey(sum)) {len=Math.max(len,j - map.get(sum) );} else {// 如果不存在该前缀和 就 进行哈希表// 这里的细节就是 // 不需要进入重复元素map.put(sum,j);}

细节二 :

当该数字存在时,由于我们需要的数组的 最大长度, 当出现下一个同样数字时, 左边的下标 的值就会 增大,从而导致 j - 左边下标值 减小

数组长度减少

4.二维数组的前缀和

dp35. 二维数组的前缀和题目链接

<1>. 题目描述

在这里插入图片描述

题目含义

给定一个 左上角 和 右下角的坐标,求出左下角和 右下角坐标所围成的 矩阵的 数字总和

<2>. 讲解算法思想

题目分析

想要求本题,最好的思路还是利用我们的二维前缀和的思想

那么我们的 二维前缀和 该怎么计算 ? ? ?

提示一下

我们需要在一维前缀和的基础上进行把 二维数组进行拆分 即可

算法步骤:

类比于一维数组的形式,如果我们能处理出来从 == [0, 0]== 位置到 == [i, j] == 位置这片区域内所有
元素的累加和,就可以在 O(1) 的时间内,搞定矩阵内任意区域内所有元素的 累加和 。因此我们
接下来仅需完成两步即可:

  • 第一步:搞出来 前缀和矩阵

这里就要用到 一维数组 里面的拓展知识,我们要在矩阵的最上面和最左边添加上一行和一列 0,这样我们就可以省去非常多的 边界条件 的处理(同学们可以自行尝试直接搞出来前缀和矩阵,边界条件的处理会让你崩溃的)。处理后的矩阵就像这样:

在这里插入图片描述

  • 第二步

这样,我们填写前缀和矩阵数组的时候,下标直接从 1 开始,能大胆使用 i - 1 , j - 1
置的值。

注意 dp 表与原数组 matrix 内的元素的 映射关系

i. 从 dp 表到 matrix 矩阵,横纵坐标减一

ii. 从 matrix 矩阵到 dp 表,横纵坐标加一

前缀和矩阵中 sum[i][j] 的含义,以及如何递推二维前缀和方程

sum[i][j] 的含义:

sum[i][j] 表示,从 [0, 0] 位置到 [i, j] 位置这段区域内,所有元素的累加和。对应
下图的红色区域:

简单来说就是:

如下图,假设 红色 区域为 a,紫色 区域为 b , 绿色 区域为 d , 橙色 区域为 c

计算前缀和时, 我们就可以把他们看成是一块又一块的区域来 累加

而我们通过这样的分解区域是需要得到 a + b + c + d 总和的面积, 那我们就需要转化成 s= (a+b) + (a+c) + d - a 从而得到我们 前缀和 数组

在这里插入图片描述

在这里插入图片描述

所以我们就可以推导出 dp[i][j] = dp[i][j-1] + dp[i-1][j] - dp[i-1][j-1] + nums[i][j];

那么我们该怎么使用 二维前缀和数组 呢 ?

在这里插入图片描述

我们想要得到红色的区域,总得用 dp[x2][y2] - 区域 b - 区域 c + 区域 a 得到我们的区域 d

在这里插入图片描述

从中我们可以推导出 使用二维前缀和的公式为 : d = dp[x2][y2] - dp[x1-1][y2] - dp[x2][y1-1] + dp[x1-1][y1-1];

<3>. 编写代码

import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别int n = in.nextInt(), m = in.nextInt(), q = in.nextInt();long array[][] = new long[n + 1][m + 1];for (int i = 1; i < n + 1; ++i) {for (int j = 1; j < m + 1; j++) {array[i][j] = in.nextInt();}}long dp[][] = new long[n + 1][m + 1];for (int i = 1; i < n + 1; ++i) {for (int j = 1; j < m + 1; j++) {dp[i][j] = dp[i][j - 1] + dp[i - 1][j] + array[i][j] - dp[i - 1][j - 1];}}while (q > 0) {int x1 = in.nextInt(), y1 = in.nextInt(), x2 = in.nextInt(), y2 = in.nextInt();long sum = dp[x2][y2] - dp[x2][y1 - 1] - dp[x1 - 1][y2] + dp[x1 - 1][y1 - 1];System.out.println(sum);q--;}}
}

在这里插入图片描述

三.前缀和算法的总结

  • 我们先初步认识了前缀和算法本质上就是 0到i 位置的和的一个数组, 我们通过 基本前缀和数组 通过转化进行来实现对 子数组 的计算 。

  • 更在 ‘除自身以外的乘积’的上, 我们认识到也可以同时构造 前缀和 以及 后缀和 的思想来实现对我数组 两头同时计算

  • 以及在 ‘和可被 k 整除的子数组’ 和 ‘连续数组’ 中 , 我们认识到 可以用 前缀和 搭配 哈希表 来 寻找某个固定值 的子数组的 个数 或者 下标

  • 最后的二维数组, 更让我们在 矩阵区域的思维 上进行 把 二维数组 进行划分成一段一段我们 已有的的区域 , 来 初始化和使用 我们的 二维前缀和数组

如果觉得小编写的还不错的咱可支持 三连 下 (定有回访哦) , 不妥当的咱请评论区 指正

希望我的文章能给各位宝子们带来哪怕一点点的收获就是 小编创作 的最大 动力 💖 💖 💖

在这里插入图片描述

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

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

相关文章

代码审计--一道简单的文件包含题目的多种利用方式

NO.1 传统方法 首先来看下代码 <?php error_reporting(0); if(isset($_GET["file"])){include($_GET["file"]); }else{highlight_file(__FILE__);phpinfo(); } ?>看完代码后再来学习学习函数吧&#xff0c;毕竟菜啊&#xff01;&#xff01;&…

NASA数据集——阿尔法喷气式大气实验甲醛(HCHO)数据

Alpha Jet Atmospheric eXperiment Formaldehyde Data 简介 阿尔法喷气式大气实验甲醛数据 阿尔法喷气式大气实验&#xff08;AJAX&#xff09;是美国国家航空航天局艾姆斯研究中心与 H211, L.L.C. 公司的合作项目&#xff0c;旨在促进对加利福尼亚、内华达和太平洋沿岸地区的…

【NOIP2014普及组复赛】题4:子矩阵

题3&#xff1a;子矩阵 【题目描述】 给出如下定义&#xff1a; 1.子矩阵&#xff1a;从一个矩阵当中选取某些行和某些列交叉位置所组成的新矩阵&#xff08;保持行与列的相对顺序&#xff09;被称为原矩阵的一个子矩阵。 例如&#xff0c;下面左图中选取第 2 、 4 2、4 2、…

vue项目中使用json编辑器

实现效果&#xff1a; 借助插件json-editor-vue3实现效果如图一&#xff0c;如果嫌丑可以通过类名改一下样式如图二。 实现过程&#xff1a; 安装插件&#xff1a;npm install json-editor-vue3 文档链接&#xff1a;GitCode - 开发者的代码家园 <script setup name&quo…

AcWing 3466. 清点代码库(STL:map,vector)

3466. 清点代码库 需要求有几种不同数列&#xff0c;每种有多少个&#xff0c;可以想到用map。它的键是一个数列&#xff0c;可以把它放在vector里。也就是map<vector<int>,int> 要满足要求的输出序列&#xff0c;就要想把它放在其他容器&#xff0c;或数组里&…

Vite + Vue3 部署 GitHub

因为静态资源是可以部署到 GitHub 上&#xff0c;自己顺便学习部署网站 因为我使用的是 Vite 工具&#xff0c;官方有提供相应 Demo 部署静态站点 | Vite 官方中文文档 新建文件夹 .github 然后再建一个文件夹 workflows 新建文件 main.yml 文件 直接使用官方文档 demo #…

如何处理时间序列的缺失数据

您是否应该删除、插入或估算&#xff1f; 世界上没有完美的数据集。每个数据科学家在数据探索过程中都会有这样的感觉&#xff1a; df.info()看到类似这样的内容&#xff1a; 大多数 ML 模型无法处理 NaN 或空值&#xff0c;因此如果您的特征或目标包含这些值&#xff0c;则在…

Java-MySql:JDBC

目录 JDBC概述 JDBC搭建 1、导入mysql开发商提供的jar包 2、注册驱动 3、与数据库连接 注解&#xff1a; Statement&#xff1a; 代码 运行 PreparedStatement&#xff1a; 代码 运行 PreparedStatement和Statement Statement 增 代码 运行 删 代码 运…

九、图形化脚本

多年来&#xff0c; shell脚本一直都被认为是枯燥乏味的。但如果你准备在图形化环境中运行脚本时&#xff0c;就未必如此了。有很多与脚本用户交互的方式并不依赖read和echo语句。 9.1 创建文本菜单 创建交互式shell脚本最常用的方法是使用菜单。提供各种选项可以帮助脚本用户…

AI遇上遥感,未来会怎样?

随着航空、航天、近地空间等多个遥感平台的不断发展&#xff0c;近年来遥感技术突飞猛进。由此&#xff0c;遥感数据的空间、时间、光谱分辨率不断提高&#xff0c;数据量也大幅增长&#xff0c;使其越来越具有大数据特征。对于相关研究而言&#xff0c;遥感大数据的出现为其提…

基于MetaGPT构建LLM多智能体

前言 你好&#xff0c;我是GISer Liu&#xff0c;在上一篇文章中&#xff0c;我们用了两万多字详细拆解了单个Agent的组成&#xff0c;并通过Github Trending订阅智能体理解MetaGPT框架的订阅模块如何解决应用问题&#xff0c;但是对于复杂&#xff0c;并行的任务&#xff0c;单…

【vue】el-select选择器实现宽度自适应

选择器的宽度根据内容长度进行变化 <div class"Space_content"><el-selectv-model"value":placeholder"$t(bot.roommessage)"class"select"size"small"style"margin-right: 10px"change"selectcha…

JavaSE——集合框架二(1/6)-前置知识-可变参数、Collections工具类

目录 可变参数 Collections工具类 Collections的常用静态方法 实例演示 可变参数 可变参数 就是一种特殊形参&#xff0c;定义在方法、构造器的形参列表里&#xff0c;格式是&#xff1a;数据类型...参数名称 可变参数的特点和好处 特点&#xff1a;可以不传数据给它&am…

SQL常用基础语句(一)-- ABCDE开头

AS 将列名从 count(*) 修改为 total select count(*) as total from users where status0 将列名 username 改为 uname&#xff0c; password 改为 upwd select username as uname, password as upwd from users BETWEEN AND 说明&#xff1a;BETWEEN 筛选的是 >value1且 &l…

小程序主体变更是通过迁移吗?是需要2个小程序吗?

小程序迁移变更主体有什么作用&#xff1f;好多朋友都想做小程序迁移变更主体&#xff0c;但是又不太清楚具体有啥用&#xff0c;今天我就来详细说说。首先&#xff0c;小程序迁移变更主体最重要的作用就是可以修改主体。比如你的小程序原来是 A 公司的&#xff0c;现在 A 公司…

操作系统实验四:多线程与信号量编程

操作系统实验上机 更多技术请访问&#xff1a;www.xuanworld.top 部分审核不通过的文章将发至个人博客&#xff1a;www.xuanworld.top 欢迎来52破解论坛阅读帖子&#xff1a;https://www.52pojie.cn/thread-1891208-1-1.html 实验名称实验序号实验日期实验人多线程与信号量…

010-Linux磁盘介绍

文章目录 1、名词 2、类型 3、尺寸 4、接口/协议/总线 5、命名 6、分区方式 MBR分区 GPT分区 1、名词 磁盘是计算机主要的存储介质&#xff0c;可以存储大量的二进制数据&#xff0c;并且断电后也能保持数据不丢失。早期计算机使用的磁盘是软磁盘&#xff08;Floppy D…

基于yolov5和desnet的猫咪识别模型

前言 前段时间给学校的猫咪小程序搭建了识猫模型&#xff0c;可以通过猫咪的照片辨别出是那只猫猫&#xff0c;这里分享下具体的方案&#xff0c;先看效果图&#xff1a; 源代码在文末 模型训练 在训练服务器&#xff08;或你的个人PC&#xff09;上拉取本仓库代码。 图片数…

10款免费黑科技软件,强烈推荐!

1.AI视频生成——巨日禄 网页版https://aitools.jurilu.com/ "巨日禄 "是一款功能强大的文本视频生成器&#xff0c;可以快速将文本内容转换成极具吸引力的视频。操作简单&#xff0c;用户只需输入文字&#xff0c;选择喜欢的样式和模板&#xff0c; “巨日禄”就会…

Day39贪心算法part06

LC738单调递增的数字&#xff08;未掌握&#xff09; 思路分析&#xff1a;一旦出现strNum[i - 1] > strNum[i]的情况&#xff08;非单调递增&#xff09;&#xff0c;首先想让strNum[i - 1]–&#xff0c;然后strNum[i]给为9字符串是不可变的&#xff0c;不可以使用s.char…