当前位置: 首页 > news >正文

LeetCode - 850 矩形面积 II

题目来源

850. 矩形面积 II - 力扣(LeetCode)

 

题目描述

给你一个轴对齐的二维数组 rectangles 。

对于 rectangle[i] = [x1, y1, x2, y2],其中(x1,y1)是矩形 i 左下角的坐标, (xi1, yi1) 是该矩形 左下角 的坐标, (xi2, yi2) 是该矩形 右上角 的坐标。

计算平面中所有 rectangles 所覆盖的 总面积 。任何被两个或多个矩形覆盖的区域应只计算 一次 。

返回 总面积 。因为答案可能太大,返回 10^9 + 7 的 模 。

示例

示例 1:

输入:rectangles = [[0,0,2,2],[1,0,2,3],[1,0,3,1]]
输出:6
解释:如图所示,三个矩形覆盖了总面积为 6 的区域。
从(1,1)到(2,2),绿色矩形和红色矩形重叠。
从(1,0)到(2,3),三个矩形都重叠。

示例 2:

输入:rectangles = [[0,0,1000000000,1000000000]]
输出:49
解释:答案是 1018 对 (109 + 7) 取模的结果, 即 49 。

提示

  • 1 <= rectangles.length <= 200
  • rectanges[i].length = 4
  • 0 <= xi1, yi1, xi2, yi2 <= 10^9

题目解析

本题如果从 ”面“ 的角度去思考,比如:所有矩形的面积 - 矩形交集部分的面积 = 最终面积。

两个矩形的交集很容易求解,比如下面图示

虽然矩形交集很容易求解,但是想要求出所有交集,则需要让每个矩形和剩余其他矩形尝试比较,得出交集。同时求出交集矩形后,这些交集矩形也是可能互相重叠的 。。。交集的交集矩形也是可能互相重叠的。。。这样是无穷无尽的求解。因此这个思路不可取。

本题如果从 ”线“ 的角度去思考,如下图所示,从假设有一条扫描线 x = c(x1 ≤ c ≤ x4),从左向右扫描,每扫描到一个位置,则判断该位置是否有矩形覆盖,如果有矩形覆盖,比如:

  • 图1 ~ 图3 中扫描线只覆盖到了矩形[左下角(x1,y1),右上角(x2,y2)],因此矩形覆盖的高度为 ( y2 - y1),对应扫描线扫描出的矩形面积 = (x3 - x1) * ( y2 - y1)
  • 图4 ~ 图5 中扫描线覆盖了两个矩形,分别是 [左下角(x1,y1),右上角(x2,y2)]   [左下角(x3,y3),右上角(x4,y4)],因此矩形覆盖的高度区间也有两个: [y1, y2] 和 [y3, y4],而这两个区间又是具有重叠部分的,因此我们可以转化为区间问题,利用区间问题解法,求解出所有区间的不重叠长度之和 height 。具体求解过程在下面。那么扫描线扫描出来的面积为 (x2 - x3) * h。
  1. 首先,排序区间,按照起始位置升序,如果起始位置相同,则按照结束位置降序
  2. 然后,遍历区间,假设当前区间是 [start, end],上一个区间是 [last_start, last_end],

    若 last_end >= end,那么说明当前区间被上一个区间完全覆盖,可以继续忽略当前区间(因为当前区间的长度已经在上一个区间被统计过了)
    若 last_end < end,那么当前区间的非重叠部分为 [max(start, last_end), end],统计该部分长度:height += end - max(start, last_end),并更新last_end = end
  3. 最后,我们就求出了区间组所有区间覆盖的不重叠长度了。

上面这种思路就是 ”扫描线算法“,扫描线法可以将 "面" 的问题,分解为 "线" 的问题,将 "矩形(面)交集问题" 降解为 "区间(线)交集问题"。

C源码实现

#define MAX_N 200
#define MOD (1e9 + 7)int cmp(const void* a, const void* b) { return *(int*)a - *(int*)b; }int cmp2(const void* a, const void* b) {int* A = (int*)a;int* B = (int*)b;return A[0] != B[0] ? A[0] - B[0] : B[1] - A[1];
}int rectangleArea(int** rectangles, int rectanglesSize, int* rectanglesColSize) {// 统计所有矩形的左边边、右边边所在位置的x坐标int listX[MAX_N];int listX_size = 0;for (int i = 0; i < rectanglesSize; i++) {listX[listX_size++] = rectangles[i][0]; // 矩形左边边x坐标位置listX[listX_size++] = rectangles[i][2]; // 矩形右边边x坐标位置}// 所有x坐标升序(每个x视为一条扫描线)qsort(listX, listX_size, sizeof(int), cmp);// 记录所有矩形并集面积long ans = 0;for (int i = 1; i < listX_size; i++) {// 前一个扫描线x坐标int preX = listX[i - 1];// 当前扫描线x坐标int curX = listX[i];// 相邻两个扫描线的距离long width = curX - preX;// 距离为0, 则跳过if (width == 0)continue;// 将在[x1,x2]区间上的矩形片段(垂直方向高度区间)收集起来int lines[MAX_N][2];int lines_size = 0;// 遍历每个矩形for (int j = 0; j < rectanglesSize; j++) {// 矩形左上角坐标(x1,y1), 矩形右下角坐标(x2,y2)int x1 = rectangles[j][0], y1 = rectangles[j][1],x2 = rectangles[j][2], y2 = rectangles[j][3];// 如果矩形包含了 [x1, x2] 区间if (x1 <= preX && curX <= x2) {// 那么该矩形在 水平方向区间[x1, x2] 对应的 垂直方向区间为 [y2, y1]lines[lines_size][0] = y1;lines[lines_size][1] = y2;lines_size++;}}// 将处于水方向区间 [x1, x2] 的所有垂直方向区间排序:按照起始位置升序, 如果起始位置相同, 则按照结束位置降序,这样排序的目的是保证排序后,前面的区间尽可能可以覆盖后面的区间qsort(lines, lines_size, sizeof(lines[0]), cmp2);// 记录lines多个区间,求长度之和,(重叠部分只计算一次)long height = 0;int last_end = -1;for (int j = 0; j < lines_size; j++) {int start = lines[j][0];int end = lines[j][1];// 如果 last_end >= end, 则当前区间被上一个区间完全覆盖,因此可以跳过// 如果 last_end < endif (last_end < end) {// 则当前区间的不重叠部分是 [max(start, last_end), end]height += end - (int)fmax(start, last_end);// 更新last_endlast_end = end;}}// 当前扫描线扫描到的面积为 width * heightans += width * height;ans %= (int)MOD;}return (int)ans;
}

C++源码实现

#define MOD (1E9 + 7)class Solution {
public:int rectangleArea(vector<vector<int>>& rectangles) {// 统计所有矩形的左边边、右边边所在位置的x坐标vector<int> listX;for (vector<int>& rect : rectangles) {listX.emplace_back(rect[0]); // 矩形左边边x坐标位置listX.emplace_back(rect[2]); // 矩形右边边x坐标位置}// 所有x坐标升序(每个x视为一条扫描线)sort(listX.begin(), listX.end());// 记录所有矩形并集面积long ans = 0;for (int i = 1; i < listX.size(); i++) {// 前一个扫描线x坐标int preX = listX[i - 1];// 当前扫描线x坐标int curX = listX[i];// 相邻两个扫描线的距离long width = curX - preX;// 距离为0, 则跳过if (width == 0)continue;// 将在[x1,x2]区间上的矩形片段(垂直方向高度区间)收集起来vector<vector<int>> lines;// 遍历每个矩形for (vector<int>& rect : rectangles) {// 矩形左下角坐标(x1,y1), 矩形右上角坐标(x2,y2)int x1 = rect[0], y1 = rect[1], x2 = rect[2], y2 = rect[3];// 如果矩形包含了 [x1, x2] 区间if (x1 <= preX && curX <= x2) {// 那么该矩形在 水平方向区间[x1, x2] 对应的 垂直方向区间为 [y1, y2]lines.emplace_back(vector<int>{y1, y2});}}// 将处于水方向区间 [x1, x2]// 的所有垂直方向区间排序:按照起始位置升序, 如果起始位置相同,// 则按照结束位置降序,这样排序的目的是保证排序后,前面的区间尽可能可以覆盖后面的区间sort(lines.begin(), lines.end(),[](vector<int>& lineA, vector<int>& lineB) {if (lineA[0] != lineB[0]) {return lineA[0] < lineB[0];} else {return lineA[1] > lineB[1];}});// 记录lines多个区间,求长度之和,(重叠部分只计算一次)long height = 0;int last_end = INT_MIN;for (vector<int>& line : lines) {int start = line[0];int end = line[1];// 如果 last_end >= end,// 则当前区间被上一个区间完全覆盖,因此可以跳过 如果 last_end <// endif (last_end < end) {// 则当前区间的不重叠部分是 [max(start, last_end), end]height += end - max(start, last_end);// 更新last_endlast_end = end;}}// 当前扫描线扫描到的面积为 width * heightans += width * height;ans %= (int) MOD;}return (int) ans;}
};

Java源码实现

class Solution {public int rectangleArea(int[][] rectangles) {// 统计所有矩形的左边边、右边边所在位置的x坐标ArrayList<Integer> listX = new ArrayList<>();for (int[] rect : rectangles) {listX.add(rect[0]);listX.add(rect[2]);}// 所有x坐标升序(每个x视为一条扫描线)listX.sort((a, b) -> a - b);// 记录所有矩形并集面积long ans = 0;for (int i = 1; i < listX.size(); i++) {// 前一个扫描线x坐标int preX = listX.get(i - 1);// 当前扫描线x坐标int curX = listX.get(i);// 相邻两个扫描线的距离int width = curX - preX;// 距离为0, 则跳过if (width == 0)continue;// 将在[x1,x2]区间上的矩形片段(垂直方向高度区间)收集起来ArrayList<int[]> lines = new ArrayList<>();// 遍历每个矩形for (int[] rect : rectangles) {// 矩形左下角坐标(x1,y1), 矩形右上角坐标(x2,y2)int x1 = rect[0], y1 = rect[1], x2 = rect[2], y2 = rect[3];// 如果矩形包含了 [x1, x2] 区间if (x1 <= preX && curX <= x2) {// 那么该矩形在 水平方向区间[x1, x2] 对应的 垂直方向区间为 [y1, y2]lines.add(new int[] { y1, y2 });}}// 将处于水方向区间 [x1, x2] 的所有垂直方向区间排序:按照起始位置升序, 如果起始位置相同,则按照结束位置降序,// 这样排序的目的是保证排序后,前面的区间尽可能可以覆盖后面的区间lines.sort((lineA, lineB) -> lineA[0] != lineB[0] ? lineA[0] - lineB[0] : lineB[1] - lineA[1]);// 记录lines多个区间,求长度之和,(重叠部分只计算一次)int height = 0;int last_end = -1;for (int[] line : lines) {int start = line[0];int end = line[1];// 如果 last_end >= end, 则当前区间被上一个区间完全覆盖,因此可以跳过// 如果 last_end < endif (last_end < end) {// 则当前区间的不重叠部分是 [max(start, last_end), end]height += end - Math.max(start, last_end);// 更新last_endlast_end = end;}}// 当前扫描线扫描到的面积为 width * heightans += (long) width * height;ans %= (int) (1e9 + 7);}return (int) ans;}
}

Python源码实现

class Solution(object):def rectangleArea(self, rectangles):""":type rectangles: List[List[int]]:rtype: int"""# 统计所有矩形的左边边、右边边所在位置的x坐标listX = []for rect in rectangles:listX.append(rect[0])  # 矩形左边边x坐标位置listX.append(rect[2])  # 矩形右边边x坐标位置# 所有x坐标升序(每个x视为一条扫描线)listX.sort()# 记录所有矩形并集面积ans = 0for i in range(1, len(listX)):# 前一个扫描线x坐标preX = listX[i - 1]# 当前扫描线x坐标curX = listX[i]# 相邻两个扫描线的距离width = curX - preX# 距离为0, 则跳过if width == 0:continue# 将在[x1,x2]区间上的矩形片段(垂直方向高度区间)收集起来lines = []# 遍历每个矩形# 矩形左下角坐标(x1,y1),矩形右上角坐标(x2,y2)for x1, y1, x2, y2 in rectangles:# 如果矩形包含了 [x1, x2] 区间if x1 <= preX and curX <= x2:# 那么该矩形在 水平方向区间[x1, x2] 对应的 垂直方向区间为 [y1, y2]lines.append((y1, y2))# 将处于水方向区间 [x1, x2] 的所有垂直方向区间排序:按照起始位置升序, 如果起始位置相同, 则按照结束位置降序,这样排序的目的是保证排序后,前面的区间尽可能可以覆盖后面的区间lines.sort(key=lambda line: (line[0], -line[1]))# 记录lines多个区间,求长度之和,(重叠部分只计算一次)height = 0# 题目说坐标范围 [-100, 100], 因此对应 [?, -101] 的区间必然不会和任何区间相交last_end = -1# 如果 last_end >= end, 则当前区间被上一个区间完全覆盖,因此可以跳过# 如果 last_end < endfor start, end in lines:if last_end < end:# 则当前区间的不重叠部分是 [max(start, last_end), end]height += end - max(start, last_end)# 更新last_endlast_end = end# 当前扫描线扫描到的面积为 width * heightans += width * heightreturn ans % 1000000007

JavaScript源码实现

/*** @param {number[][]} rectangles* @return {number}*/
var rectangleArea = function (rectangles) {// 统计所有矩形的左边边、右边边所在位置的x坐标const listX = [];for (let rect of rectangles) {listX.push(rect[0]); // 矩形左边边x坐标位置listX.push(rect[2]); // 矩形右边边x坐标位置}// 所有x坐标升序(每个x视为一条扫描线)listX.sort((a, b) => a - b);// 记录所有矩形并集面积let ans = 0n;for (let i = 1; i < listX.length; i++) {// 前一个扫描线x坐标const preX = listX[i - 1];// 当前扫描线x坐标const curX = listX[i];// 相邻两个扫描线的距离const width = curX - preX;// 距离为0, 则跳过if (width == 0) continue;// 将处于[x1,x2]区间上的矩形片段(垂直方向高度区间)收集起来const lines = [];// 遍历每个矩形// 矩形左下角坐标(x1,y1),矩形右上角坐标(x2,y2)for (let [x1, y1, x2, y2] of rectangles) {// 如果矩形有片段处于 [x1, x2] 区间if (x1 <= preX && curX <= x2) {// 那么该矩形在 水平方向区间[x1, x2] 对应的 垂直方向区间为 [y1, y2]lines.push([y1, y2]);}}// 将处于水方向区间 [x1, x2] 的所有垂直方向区间排序:按照起始位置升序, 如果起始位置相同, 则按照结束位置降序,这样排序的目的是保证排序后,前面的区间尽可能可以覆盖后面的区间lines.sort((lineA, lineB) =>lineA[0] != lineB[0] ? lineA[0] - lineB[0] : lineB[1] - lineA[1]);// 记录lines多个区间,求长度之和,(重叠部分只计算一次)let height = 0;let last_end = -1;for (let [start, end] of lines) {// 如果 last_end >= end, 则当前区间被上一个区间完全覆盖,因此可以跳过// 如果 last_end < endif (last_end < end) {// 则当前区间的不重叠部分是 [max(start, last_end), end]height += end - Math.max(start, last_end);// 更新last_endlast_end = end;}}// 当前扫描线扫描到的面积为 width * heightans += BigInt(width) * BigInt(height);}return Number(ans % 1000000007n);
};

相关文章:

LeetCode - 850 矩形面积 II

题目来源 850. 矩形面积 II - 力扣&#xff08;LeetCode&#xff09; 题目描述 给你一个轴对齐的二维数组 rectangles 。 对于 rectangle[i] [x1, y1, x2, y2]&#xff0c;其中&#xff08;x1&#xff0c;y1&#xff09;是矩形 i 左下角的坐标&#xff0c; (xi1, yi1) 是该…...

Jenkins Pipeline 中通过勾选参数来控制是否构建 Docker 镜像

1.定义参数&#xff1a; 使用 booleanParam 定义一个布尔参数&#xff0c;示例如下 booleanParam(name: BUILD_DOCKER, description: 是否构建Docker镜像, defaultValue: false)2.使用参数&#xff1a; 在 stage 中&#xff0c;根据参数的值决定构建方式&#xff1a; stage(编…...

C++入门基础知识86(实例)——实例11【计算自然数之和】

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///C爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于计算自然数之和相关内容&#xff01; 关…...

ChatGPT与R语言融合技术在生态环境数据统计分析、绘图、模型中的实践与进阶应用

自2022年GPT&#xff08;Generative Pre-trained Transformer&#xff09;大语言模型的发布以来&#xff0c;它以其卓越的自然语言处理能力和广泛的应用潜力&#xff0c;在学术界和工业界掀起了一场革命。在短短一年多的时间里&#xff0c;GPT已经在多个领域展现出其独特的价值…...

OpenAi以及Dify结合生成Ai模型

文章目录 1、Dify介绍2、使用 Dify3、部署Docker1.系统要求2.系统虚拟化3.下载docker 4、安装WSL1.检查是否已经安装 五、访问系统六、添加模型 1、Dify介绍 Dify官方地址。 Dify 是一个开源的 LLM 应用开发平台。其直观的界面结合了 AI 工作流、RAG 管道、Agent、模型管理、…...

【漏洞复现】用友 UFIDA /portal/pt/file/upload 任意文件上传漏洞

免责声明: 本文内容旨在提供有关特定漏洞或安全漏洞的信息,以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步,并非出于任何恶意目的。阅读者应该明白,在利用本文提到的漏洞信息或进行相关测试时,可能会违反某些法律法规或服…...

C:内存函数

目录 前言&#xff1a; 一、memcpy 函数的使用及实现 1、memcpy函数的介绍 1.1 memcpy函数参数解读 2、memcpy函数的使用 3、memcpy函数的模拟实现 二、memmove函数的使用及模拟 1、memmove函数的使用 2、memmove函数的模拟实现 三、memset 函数的使用 1、memset函数的…...

【Web】御网杯信息安全大赛2024 wp(全)

目录 input_data admin flask 如此多的FLAG 一夜醒来之全国CTF水平提升1000倍&#x1f60b; input_data 访问./.svn后随便翻一翻拿到flag admin dirsearch扫出来 访问./error看出来是java框架 测出来是/admin;/路由打Spring View Manipulation(Java)的SSTI https:/…...

VC++同时处理ANSI和Unicode字符集,除了使用TCHAR和_T()宏外,还有其他方法可以实现吗?

在我的C项目中&#xff0c;如果我需要同时处理ANSI和Unicode字符集&#xff0c;除了使用TCHAR和_T()宏外&#xff0c;还有其他方法可以实现吗&#xff1f; 除了使用 TCHAR 和 _T() 宏之外&#xff0c;还有其他方法可以实现同时处理 ANSI 和 Unicode 字符集&#xff1a; 1. 使用…...

MATLAB定位程序与讲解【专栏介绍】

AOA&#xff08;到达角度&#xff09;定位原理&#xff1a; 描述了基于到达角度进行定位的方法&#xff0c;适用于一维、二维或三维空间。 由动静压之比求马赫数的MATLAB函数&#xff1a; 提供了一个计算马赫数的函数&#xff0c;用于流体力学中速度的计算。 三边法定位与三点法…...

机器学习3--numpy

Numpy 一、numpy是什么&#xff1f;二、N维数组三、数组基本操作四、数组的运算 一、numpy是什么&#xff1f; numpy是一个开源的python科学计算库&#xff0c;用于处理任意维度的数组。numpy用ndarray处理多维数组。 import numpy as np np.array创建数组 机器学习数据量很大…...

Linux之我不会

一、常用命令 1.系统管理 1.1 systemctl start | stop | restart | status 服务名 案例实操 1 查看防火墙状态 systemctl status firewalld2 停止防火墙服务 systemctl stop firewalld3 启动防火墙服务 systemctl start firewalld4 重启防火墙服务 systemctl restart f…...

音视频整体解码流程和同步流程

目录 1. 整体解码流程1. 初始化 FFmpeg2. 打开媒体文件3. 查找解码器4. 打开解码器5. 读取和解码数据6. 处理解码后的帧7. 释放资源 2. 音视频同步整体流程1. 解复用媒体流2. 解码3. 以音频为时钟源进行音视频同步的策略4. 缓冲区设计 现在先说大体流程&#xff0c;不分析代码 …...

1.2 HuggingFists安装说明-Linux安装

Linux版安装说明 下载地址 【GitHub】https://github.com/Datayoo/HuggingFists 【百度网盘】https://pan.baidu.com/s/12-qzxARjzRjYFvF8ddUJQQ?pwd2024 安装说明 环境要求 操作系统&#xff1a;CentOS7 硬件环境&#xff1a;至少4核8G&#xff0c;系统使用Containerd…...

四,MyBatis-Plus 当中的主键策略和分页插件的(详细实操使用)

四&#xff0c;MyBatis-Plus 当中的主键策略和分页插件的(详细实操使用) 文章目录 四&#xff0c;MyBatis-Plus 当中的主键策略和分页插件的(详细实操使用)1. 主键策略1.1 主键生成策略介绍 2. 准备工作&#xff1a;2.1 AUTO 策略2.2 INPUT 策略2.3 ASSIGN_ID 策略2.3.1 雪花算…...

Win32打开UWP应用

最近无意间发现Windows里一个神奇的文件夹。 shell:appsfolder 运行打开 这个文件夹后&#xff0c;你可以看到本机安装的所有应用程序。 我觉得这个挺方便的&#xff0c;所以做了一个简单的appFolderDialog包给C#用 项目地址&#xff1a;https://github.com/TianXiaTech/App…...

C# C++ 笔记

第一阶段知识总结 lunix系统操作 1、基础命令 &#xff08;1&#xff09;cd cd /[目录名] 打开指定文件目录 cd .. 返回上一级目录 cd - 返回并显示上一次目录 cd ~ 切换到当前用户的家目录 &#xff08;2&#xff09;pwd pwd 查看当前所在目录路径 pwd -L 打印当前物理…...

关于最小二乘法

最小二乘法的核心思想简单而优雅&#xff1a;我们希望找到一条最佳的曲线&#xff0c;使其尽可能贴近所有的数据点。想象一下&#xff0c;当你在画布上描绘一条线&#xff0c;目标是让这条线与点的距离最小。数学上&#xff0c;这可以表示为&#xff1a; 在这个公式中&#xff…...

国产OpenEuler与Centos全面之比较

OpenEuler 和 CentOS 都是流行的 Linux 发行版&#xff0c;但它们有一些关键的区别。以下是 OpenEuler 和 CentOS 的全面比较&#xff1a; 1. 起源和支持&#xff1a; - OpenEuler&#xff1a;由华为公司支持&#xff0c;中国开源社区主导开发的操作系统&#xff0c;旨在构建一…...

Java面试题一

一、Java语言有哪些特性&#xff1f; Java语言具有多种特性&#xff0c;这些特性使得Java成为一种广泛使用的编程语言。以下是Java语言的一些主要特性&#xff1a; 面向对象&#xff08;Object-Oriented&#xff09;&#xff1a; Java是一种纯面向对象的编程语言。它支持类&…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

Java 加密常用的各种算法及其选择

在数字化时代&#xff0c;数据安全至关重要&#xff0c;Java 作为广泛应用的编程语言&#xff0c;提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景&#xff0c;有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库&#xff0c;专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性&#xff0c;并提供了一个通用的框架&…...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架&#xff0c;允许使用简单的变成模型跨计算机对大型集群进行分布式处理&#xff08;1.海量的数据存储 2.海量数据的计算&#xff09;Hadoop核心组件 hdfs&#xff08;分布式文件存储系统&#xff09;&a…...

在 Spring Boot 项目里,MYSQL中json类型字段使用

前言&#xff1a; 因为程序特殊需求导致&#xff0c;需要mysql数据库存储json类型数据&#xff0c;因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...

HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散

前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说&#xff0c;在叠衣服的过程中&#xff0c;我会带着团队对比各种模型、方法、策略&#xff0c;毕竟针对各个场景始终寻找更优的解决方案&#xff0c;是我个人和我司「七月在线」的职责之一 且个人认为&#xff0c…...

comfyui 工作流中 图生视频 如何增加视频的长度到5秒

comfyUI 工作流怎么可以生成更长的视频。除了硬件显存要求之外还有别的方法吗&#xff1f; 在ComfyUI中实现图生视频并延长到5秒&#xff0c;需要结合多个扩展和技巧。以下是完整解决方案&#xff1a; 核心工作流配置&#xff08;24fps下5秒120帧&#xff09; #mermaid-svg-yP…...