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

算法24:LeetCode_并查集相关算法

目录

题目一:力扣547题,求省份数量

题目二:岛屿数量

题目三:岛屿数量拓展


什么是并查集,举个简单的例子。学生考试通常会以60分为及格分数,我们将60分及以上的人归类为及格学生,而60分以下归类为不及格的学生, 通过记录学生ID。现在要求根据学生的ID,迅速的找出这名学生成绩是否及格。这种归类就是合并,而根据学生ID查找就是查询,合起来就是并查集。

可能会有人说不用并查集也可以干这件事情,但是有没有想过一个问题,一个班级,一个年级,一个市,一个省,全中国。如果都要统计这些信息呢?如果要统计及格的全部人数呢?难到要一个一个去查吗?此处,并查集就发挥作用了。

下面推荐一篇博客,对并查集的解释还算通俗易懂,有兴趣的朋友可以看看https://blog.csdn.net/LWR_Shadow/article/details/124873281

下面来分享一些并查集的算法题:

题目一:力扣547题,求省份数量

题目的具体信息可以直接查看547. 省份数量

这是一道奇葩的题目,非此即彼,只要不相连的城市,就属于其他省。而现实中,比如苏州和无锡相连接,徐州和他们都不相连,但是无锡、苏州、徐州却都属于江苏省。既然题目是这么要求的,那我们就按照要求进行设计。

式例1:这组二维数组是什么意思呢?

从1节点的角度:【1,1,0】代表1节点自己连接自己,自己连接2节点,不连接点3节点。

从2节点的角度:【1,1,0】自己连接1节点,自己连接自己,自己不连接3节点。

从3节点的角度:【0,0,1】自己不连接1节点,不连接2节点,自己连接自己。

所以,得出的结论是节点1和节点2是同一个省,而3节点是另外一个省的城市,共2个省份

式例2:完全按照上方分析的思路去分析,节点1、节点2、节点3互不连接,也就是说他们分别属于不同的省份,这个demo共有3个省份。

下面使用并查集的知识进行解答:

package code03.并查集_04;/**** 链接 https://leetcode.cn/problems/number-of-provinces/*/
public class Code01_ProvinceCount {public static int findCircleNum(int[][] M){int length = M.length;UnionFind uom = new UnionFind(length);for (int i = 0; i < M.length; i++) {for (int j = i + 1; j < length; j++) {if (M[i][j] == 1) {uom.union(i, j);}}}return uom.size();}static class UnionFind {//父节点private int[] parent;// 辅助结构private int[] help;// 一共有多少个集合private int sets;// i所在的集合大小是多少private int[] size;UnionFind(int length){parent = new int[length];size = new int[length];//help的初始化, 个人想每次调用的时候初始化,但是数据量较大的//时候可能会吃内存help = new int[length];//本题比较特殊,二维数组长度为多少,集合最多就可能是多少sets = length;//记录数组的下标地址,可以通过下标找到父亲节点for (int i = 0; i < length; i++) {parent[i] = i;//i所在的集合大小是多少, 默认是自己, 所以是1size[i] = 1;}}public void union(int i, int j){//获取到的根节点索引. 需要注意的是,第一次调用这i和j,返回的是//他们本身的索引值。不会涉及到里面的while和for。 这样,我们本//方法体才能安稳的做合并操作,才会存在下挂的后代节点。int indexI = findRoot(i);int indexJ = findRoot(j);//如果他们两个值不相等,说明他们2个//还没有成为同一类数据。因此,我们需要//把他们设置成同一类数据if (indexI != indexJ){if (size[indexI] >= size[indexJ]) {/*** 此处的合并是合并2个不同的节点,将较小的节点指针指向较大的节点,* 这样就实现了并查集合并的目的.这是功能性合并** 而在findRoot方法中,合并的是同一节点的父节点,起到的是一个性能优化的作用*///等价于parent[indexJ] = parent[indexI], 因为没有合并之前,indexI == parent[indexI]parent[indexJ] = indexI;//更新合并后的根节点的后代数量size[indexI] = size[indexI] + size[indexJ];//被合并后的根节点,不再保存后代信息size[indexJ] = 0;}else {parent[indexI] = indexJ;size[indexJ] = size[indexJ] + size[indexI];size[indexI] = 0;}//因为我们默认的是有几组数据,就有几个省份。 但是此处发生了合并,也就意味着2组数据中//他们是在相同的省份中,因此默认值需要减少1.sets--;}}public int size() {return sets;}public int findRoot (int addressIndex){int index = 0;/***  第一次肯定是可以找到地址的,因为每个城市的父节点都是自己,*  所以他们都是在parent数组中的**  但是, 经过合并后,我们只会保存合并后的父节点的地址下标。*  数组的形式,我们只是在parent数组中,更新当前城市的父节点*  下标地址。因此,以下的while循环就出出现了*/while (addressIndex != parent[addressIndex]) {//记录下每一次遍历的父节点的下标,有可能有很多help[index] = parent[addressIndex];//指针指向父节点的下标,这样我们就可以逐层//网上找到最顶层的根节点了。addressIndex = parent[addressIndex];index++;  //index是比实际找的次数多1的}/***  我们只是在parent数组中,更新当前城市的父节点下标地址*  这样我就达到了并查集,合并同类数据的功能**  index是比实际找的次数多1的, 所以一开始就需要减1*  这也就不用担心help里面可能存在的脏数据问题了。*/for (index--; index >=0; index--) {/*** 路径压缩,把之前每一次找到的父节点下标全部指向了根节点,* 这样以后再找的话就会减少上面的while循环次数了。* 因为我们判断是否是同一类数据,就是根据根节点的下标进行判断的** 比如,a 和 b的根节点相同,那么我就可以认为a和b是同一类数据** help数组之前记录了parent数组父节点的下标,因此需要根据* 下标把这些值都给改成根节点的下标,这样这些节点以后就全部* 指向根节点了*/parent[help[index]] = addressIndex;}//其实,返回的就是一个父节点的地址下标值return addressIndex;}}public static void main(String[] args) {int[][] isConnected = {{1,1,0},{1,1,0},{0,0,1}};int size = findCircleNum(isConnected);System.out.println(size); //预期输出2int[][] isConnected2 =  {{1,0,0},{0,1,0},{0,0,1}};int size2 = findCircleNum(isConnected2);System.out.println(size2); //预期输出2}
}

题目二:岛屿数量

原题可以直接查看200. 岛屿数量

 这一题和上一题省份数量有相同和不同的部分:

相同部分是1和1相连接,就属于1片岛屿,还是算1个岛,这点和省份计算是一样的。

不同的部分是,省份中0也代表一个城市,只是它和其他城市不相连;而这道题中,0代表的是水,不是岛屿,因此在初始化的时候是有区别的。

并查集方式实现:

package code03.并查集_04;/*** https://leetcode.com/problems/number-of-islands/* 并查集方式实现*/
public class Code02_NumberOfLands {public int numIslands(char[][] grid){if (grid == null || grid.length == 0) {return 0;}int rowLength = grid.length;int colLength = grid[0].length;UnionFind uf = new UnionFind(grid);//合并第一行for (int j = 1; j < colLength; j++) {if (grid[0][j - 1] == '1' && grid[0][j] == '1') {uf.union(0, j - 1, 0, j);}}//合并第一列for (int i = 1; i < rowLength; i++) {if (grid[i - 1][0] == '1' && grid[i][0] == '1') {uf.union(i - 1, 0, i, 0);}}//从第二行第二列开始遍历for (int i = 1; i < rowLength; i++) {for (int j = 1; j < colLength; j++) {if (grid[i][j] == '1') {//上一行合并if (grid[i][j - 1] == '1') {uf.union(i, j - 1, i, j);}//前一列合并if (grid[i - 1][j] == '1') {uf.union(i - 1, j, i, j);}}}}return uf.sets;}static class UnionFind{int[] parents;int[] size;int sets;int[] helps;int row;int col;public UnionFind(char[][] gg){row = gg.length;col = gg[0].length;int length = row * col;parents = new int[length];size = new int[length];helps = new int[length];sets = 0;for (int i = 0; i < row; i++) {for (int j = 0; j < col; j++) {//优化,只有是1的是,才会更新parent下标为自己if (gg[i][j] == '1') {//生成唯一地址int index = index(i, j);//默认自己就是自己的父亲节点parents[index] = index;//每个父节点下挂的节点数量,默认为1size[index] = 1;//默认每出现1都是一个岛屿sets++;}}}}public void union (int row1, int col1, int row2, int col2){//父节点int parentIndex1 = index(row1, col1);int parentIndex2 = index(row2, col2);//根节点int rootIndex1 = findRoot(parentIndex1);int rootIndex2 = findRoot(parentIndex2);//根节点不同,则合并if (rootIndex1 != rootIndex2) {//将小的挂在大的下面if (size[rootIndex1] >= size[rootIndex2]) {parents[rootIndex2] = rootIndex1;size[rootIndex1] = size[rootIndex1] + size[rootIndex2];size[rootIndex2] = 0;}else {parents[rootIndex1] = rootIndex2;size[rootIndex2] = size[rootIndex1] + size[rootIndex2];size[rootIndex1] = 0;}sets--;}}public int index (int r, int c) {//列的长度是固定的colreturn r * col + c;}public int findRoot (int index){int rootIndex = 0;//并查集之前合并过while (index != parents[index]) {//记录下每一次找到的上层节点(父节点)helps[rootIndex] = parents[index];//当前地址指向上层节点(父节点)index = parents[index];rootIndex++;}//路径压缩for (rootIndex--; rootIndex > 0; rootIndex--) {//返回原始收集的上层节点地址下标int t = helps[rootIndex];//根据下标,更新到根节点地址,//这样所以的地址都指向了根点处,优化了性能parents[t] = index;}return index;}}public static void main(String[] args) {char[][] bb = {{'1','1','1','1','0'},{'1','1','0','1','0'},{'1','1','0','0','0'},{'0','0','0','0','0'}};Code02_NumberOfLands tt = new Code02_NumberOfLands();int num = tt.numIslands(bb);System.out.println(num);}
}

渲染方式实现:

package code03.并查集_04;/*** 感染方式实现,性能非常高* 局限是部分案例无法解决*/
public class Code02_NumberOfLands_extension {public int numIslands(char[][] grid){if (grid == null || grid.length == 0) {return 0;}int num = 0;for (int row = 0; row < grid.length; row++) {for (int col = 0; col < grid[row].length; col++) {if (grid[row][col] == '1') {num++;infect(grid, row, col);}}}return num;}public void infect (char[][] bb, int row, int col){if (row < 0 || row == bb.length|| col < 0 || col == bb[0].length|| bb[row][col] != '1') {return;}bb[row][col] = 0;//上infect(bb, row-1, col);//下infect(bb, row+1, col);//左infect(bb, row, col-1);//右infect(bb, row, col+1);}public static void main(String[] args) {char[][] bb = {{'1','1','1','1','0'},{'1','1','0','1','0'},{'1','1','0','0','0'},{'0','0','0','0','0'}};Code02_NumberOfLands_extension tt = new Code02_NumberOfLands_extension();int num = tt.numIslands(bb);System.out.println(num);}
}

这一道题,渲染的方式是最优解,它的性能是高于并查集实现方式的。但是,并查集的方式可以解决很多渲染方式无法解决的问题。 因此,渲染方式和并查集方式,我们都要掌握。

题目三:岛屿数量拓展

这是一道收费题:https://leetcode.com/problems/number-of-islands-ii/

* 题目:
* 设定一个二维数组,行为 m 列为 n.
* 现在给你一组地标数据,可以定位二维数组的具体位置。 每个地标都代表有1个岛屿,
* 但是如果连在一起的话只能算做一个岛。要求每次空降一次数据,求每次的岛屿数量。
*
* 假设 3 行 3列的 二维数组。
* 给定的坐标为:[[0,0],[0,1],[1,2],[2,,1]]
* 【0,0】位置确定,此时岛为1
* 【0,1】位置确定,此时岛为1
* 【1,2】位置确定,此时岛为2
* 【2,1】位置确认,此时岛为3
*
* 输出的结果为: 【1,1,2,3】
* 请设计一种算法
package code03.并查集_04;import java.util.ArrayList;
import java.util.List;/*** https://leetcode.com/problems/number-of-islands-ii/** 题目:* 设定一个二维数组,行为 m 列为 n.* 现在给你一组地标数据,可以定位二维数组的具体位置。 每组数据都代表有1个岛屿,* 但是如果连在一起的话只能算做一个岛。要求每次空降一次数据,求每次的岛屿数量。** 假设 3 行 3列的 二维数组。* 给定的坐标为:[[0,0],[0,1],[1,2],[2,,1]]* 【0,0】位置确定,岛为1* 【0,1】位置确定,岛为1* 【1,2】位置确定,岛为2* 【2,1】位置确认,岛为3** 输入的结果为: 【1,1,2,3】*  请设计一种算法*/
public class Code03_NunbOfLandsII {public List<Integer> numIslands(int m, int n, int[][] positions){List<Integer> list = new ArrayList<>();if (m < 0 || n < 0 ||positions == null || positions.length == 0|| positions[0].length == 0) {return list;}//此时的初始化内部不同于之前的初始化UnionFind uf = new UnionFind(m, n);for (int[] position : positions) {list.add(uf.connect(position[0], position[1]));}return list;}static class UnionFind{private int[] parents;private int[] size;private int[] helps;private int sets;private int col;private int row;public UnionFind(int m, int n) {int length = m * n;parents = new int[length];size = new int[length];helps = new int[length];sets = 0;row = m;col = n;}public int connect (int row, int col){//获取当前位置int curPosition = index(row, col);//判断空间的位置是否已经是岛屿,默认为0if (size[curPosition] == 0 ) {size[curPosition] = 1;parents[curPosition] = curPosition;sets++;//合并,和渲染解题思路有点相似union(row, col, row-1, col); //上一行union(row, col, row+1, col); //下一行union(row, col, row, col-1);  //前一列union(row, col, row, col+1);  //后一列}return sets;}public void union (int row1,int col1, int row2, int col2){//越界,无法合并if (row1 < 0 || row2 < 0 || col1 < 0 || col2 < 0|| row1 == row || row2 == row|| col1 == col || col2 == col) {return;}//父节点int parentIndex1 = index(row1, col1);int parentIndex2 = index(row2, col2);//如果2个中不全是岛屿,则不合并//需要注意的地方,写忘记了, debug才查出问题if (size[parentIndex1] == 0 || size[parentIndex2] == 0) {return;}//根节点int rootIndex1 = findRoot(parentIndex1);int rootIndex2 = findRoot(parentIndex2);//根节点不同,则合并if (rootIndex1 != rootIndex2) {//将小的挂在大的下面if (size[rootIndex1] >= size[rootIndex2]) {parents[rootIndex2] = rootIndex1;size[rootIndex1] = size[rootIndex1] + size[rootIndex2];}else {parents[rootIndex1] = rootIndex2;size[rootIndex2] = size[rootIndex1] + size[rootIndex2];}sets--;}}public int index (int r, int c) {return r * col + c;}public int findRoot (int index){int rootIndex = 0;//并查集之前合并过while (index != parents[index]) {//记录下每一次找到的上层节点(父节点)helps[rootIndex] = parents[index];//当前地址指向上层节点(父节点)index = parents[index];rootIndex++;}//路径压缩for (rootIndex--; rootIndex > 0; rootIndex--) {//返回原始收集的上层节点地址下标int t = helps[rootIndex];//根据下标,更新到根节点地址,//这样所以的地址都指向了根点处,优化了性能parents[t] = index;}return index;}}public static void main(String[] args) {int m = 3;int n = 3;int[][] positions = {{0,0},{0,1},{1,2},{2,1}};Code03_NunbOfLandsII tt = new Code03_NunbOfLandsII();List list = tt.numIslands(3, 3, positions);for(int i = 0; i < list.size(); i++) {System.out.println("第 " + (i+1) + " 次空降,岛屿数量为: " + list.get(i));}}
}

相关文章:

算法24:LeetCode_并查集相关算法

目录 题目一&#xff1a;力扣547题&#xff0c;求省份数量 题目二&#xff1a;岛屿数量 题目三&#xff1a;岛屿数量拓展 什么是并查集&#xff0c;举个简单的例子。学生考试通常会以60分为及格分数&#xff0c;我们将60分及以上的人归类为及格学生&#xff0c;而60分以下归…...

TypeScript核心知识点

TypeScript 核心 类型注解 知道&#xff1a;TypeScript 类型注解 示例代码&#xff1a; // 约定变量 age 的类型为 number 类型 let age: number 18 age 19: number 就是类型注解&#xff0c;它为变量提供类型约束。约定了什么类型&#xff0c;就只能给该变量赋值什么类型的…...

基于“遥感+”融合技术在碳储量、碳收支、碳循环等多领域监测与模拟实践

以全球变暖为主要特征的气候变化已成为全球性环境问题&#xff0c;对全球可持续发展带来严峻挑战。2015年多国在《巴黎协定》上明确提出缔约方应尽快实现碳达峰和碳中和目标。2019年第49届 IPCC全会明确增加了基于卫星遥感的排放清单校验方法。随着碳中和目标以及全球碳盘点的现…...

外卖点餐系统小程序 PHP+UniAPP

一、介绍 本项目是给某大学餐厅开发的外面点餐系统&#xff0c;该项目针对校内的学生&#xff0c;配送由学校的学生负责配送。因此&#xff0c;该项目不同于互联网的外卖点餐系统。 该系统支持属于 Saas 系统&#xff0c;由平台端、商家端、用户端、以及配送端组成。 其中&a…...

vuex3的介绍与state、actions和mutations的使用

一、定义官网&#xff1a;Vuex 是什么&#xff1f; | Vuex (vuejs.org)Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态&#xff0c;并以相应的规则保证状态以一种可预测的方式发生变化。二、安装cdn<script src"/path/…...

windows 自带端口转发

使用Portproxy模式下的Netsh命令即能实现Windows系统中的端口转发&#xff0c;转发命令如下: netsh interface portproxy add v4tov4 listenaddress[localaddress] listenport[localport] connectaddress[destaddress]listenaddress – 等待连接的本地ip地址 listenport – 本…...

【算法】算法基础入门详解:轻松理解和运用基础算法

&#x1f600;大家好&#xff0c;我是白晨&#xff0c;一个不是很能熬夜&#x1f62b;&#xff0c;但是也想日更的人✈。如果喜欢这篇文章&#xff0c;点个赞&#x1f44d;&#xff0c;关注一下&#x1f440;白晨吧&#xff01;你的支持就是我最大的动力&#xff01;&#x1f4…...

2.9.1 Packet Tracer - Basic Switch and End Device Configuration(作业)

Packet Tracer - 交换机和终端设备的基本 配置地址分配表目标使用命令行界面 (CLI)&#xff0c;在两台思科互联网络 操作系统 (IOS) 交换机上配置主机名和 IP 地址。使用思科 IOS 命令指定或限制对设备 配置的访问。使用 IOS 命令来保存当前的运行配置。配置两台主机设备的 IP …...

AtCoder Beginner Contest 216(F)

F - Max Sum Counting 链接&#xff1a; F - Max Sum Counting 题意 两个 大小为 nnn 的序列 aiaiai 和 bibibi&#xff0c;任意选取一些下标 iii&#xff0c;求 max⁡(ai)>∑bi\max(ai) > \sum{bi}max(ai)>∑bi的方案数。 解析 首先考虑状态 一是和&#xff0c;…...

每天学一点之Stream流相关操作

StreamAPI 一、Stream特点 Stream是数据渠道&#xff0c;用于操作数据源&#xff08;集合、数组等&#xff09;所生成的元素序列。“集合讲的是数据&#xff0c;负责存储数据&#xff0c;Stream流讲的是计算&#xff0c;负责处理数据&#xff01;” 注意&#xff1a; ①Str…...

MatCap模拟光照效果实现

大家好&#xff0c;我是阿赵 之前介绍过各种光照模型的实现方法。那些光照模型的实现虽然有算法上的不同&#xff0c;但基本上都是灯光方向和法线方向的计算得出的明暗结果。 下面介绍一种叫做MatCap的模拟光照效果&#xff0c;这种方式计算非常简单&#xff0c;脱离灯光的计算…...

二十一、PG管理

一、 PG异常状态说明 1、 PG状态介绍 可以通过ceph pg stat命令查看PG当前状态&#xff0c;健康状态为“active clean” [rootrbd01 ~]# ceph pg stat 192 pgs: 192 activeclean; 1.3 KiB data, 64 MiB used, 114 GiB / 120 GiB avail; 85 B/s rd, 0 op/s2、pg常见状态 状…...

SAPUI5开发01_01-Installing Eclipse

1.0 简要要求概述: 本节您将安装SAPUI 5,以及如何在Eclipse Juno中集成SAPUI 5工具。 1.1 安装JDK JDK 是一种用于构建在 Java 平台上发布的应用程序、Applet 和组件的开发环境,即编写 Java 程序必须使用 JDK,它提供了编译和运行 Java 程序的环境。 在安装 JDK 之前,首…...

Qt之高仿QQ系统设置界面

QQ或360安全卫士的设置界面都是非常有特点的,所有的配置项都在一个垂直的ScrollArea中,但是又能通过左侧的导航栏点击定位。这样做的好处是既方便查看指定配置项,又方便查看所有配置项。 一.效果 下面左边是当前最新版QQ的系统设置界面,右边是我的高仿版本,几乎一毛一样…...

JVM概览:内存空间与数据存储

核心的五个部分虚拟机栈&#xff1a;局部变量中基础类型数据、对象的引用存储的位置&#xff0c;线程独立的。堆&#xff1a;大量运行时对象都在这个区域存储&#xff0c;线程共享的。方法区&#xff1a;存储运行时代码、类变量、常量池、构造器等信息&#xff0c;线程共享。程…...

固态存储设备固件升级方案

1. 前言 随着数字化时代的发展&#xff0c;数字数据的量越来越大&#xff0c;相应的数据存储的需求也越来越大&#xff0c;存储设备产业也是蓬勃发展。存储设备产业中&#xff0c;发展最为迅猛的则是固态存储(Solid State Storage&#xff0c;SSS)。数字化时代&#xff0c;海量…...

Python交通标志识别基于卷积神经网络的保姆级教程(Tensorflow)

项目介绍 TensorFlow2.X 搭建卷积神经网络&#xff08;CNN&#xff09;&#xff0c;实现交通标志识别。搭建的卷积神经网络是类似VGG的结构(卷积层与池化层反复堆叠&#xff0c;然后经过全连接层&#xff0c;最后用softmax映射为每个类别的概率&#xff0c;概率最大的即为识别…...

基于Selenium+Python的web自动化测试框架(附框架源码+项目实战)

目录 一、什么是Selenium&#xff1f; 二、自动化测试框架 三、自动化框架的设计和实现 四、需要改进的模块 五、总结 总结感谢每一个认真阅读我文章的人&#xff01;&#xff01;&#xff01; 重点&#xff1a;配套学习资料和视频教学 一、什么是Selenium&#xff1f; …...

Python进阶-----高阶函数zip() 函数

目录 前言&#xff1a; zip() 函数简介 运作过程&#xff1a; 应用实例 1.有序序列结合 2.无序序列结合 3.长度不统一的情况 前言&#xff1a; 家人们&#xff0c;看到标题应该都不陌生了吧&#xff0c;我们都知道压缩包文件的后缀就是zip的&#xff0c;当然还有r…...

win10打印机拒绝访问解决方法

一直以来,在安装使用共享打印机打印一些文件的时候&#xff0c;会遇到错误提示&#xff1a;“无法访问.你可能没有权限使用网络资源。请与这台服务器的管理员联系”的问题&#xff0c;那为什么共享打印机拒绝访问呢&#xff1f;别着急&#xff0c;下面为大家带来相关的解决方法…...

深度学习训练营之数据增强

深度学习训练营学习内容原文链接环境介绍前置工作设置GPU加载数据创建测试集数据类型查看以及数据归一化数据增强操作使用嵌入model的方法进行数据增强模型训练结果可视化自定义数据增强查看数据增强后的图片学习内容 在深度学习当中,由于准备数据集本身是一件十分复杂的过程,…...

Tomcat安装及启动

日升时奋斗&#xff0c;日落时自省 目录 1、Tomcat下载 2、JDK安装及配置环境 3、Tomcat配置环境 4、启动Tomcat 5、部署演示 1、Tomcat下载 直接入主题&#xff0c;下载Tomcat 首先就是别下错了&#xff0c;直接找官方如何看是不是广告&#xff0c;或者造假 搜索Tomc…...

【专项训练】排序算法

排序算法 非比较类的排序,基本上就是放在一个数组里面,统计每个数出现的次序 最重要的排序是比较类排序! O(nlogn)的3个排序,必须要会!即:堆排序、快速排序、归并排序! 快速排序:分治 经典快排 def quickSort1(arr...

Android压测测试事件行为参数对照表

执行参数参数说明颗粒度指标基础参数--throttle <ms> 用于指定用户操作间的时延。 -s 随机数种子&#xff0c;用于指定伪随机数生成器的seed值&#xff0c;如果seed值相同&#xff0c;则产生的时间序列也相同。多用于重测、复现问题。 -v 指定输出日志的级别&#xff0c;…...

【观察】亚信科技:“飞轮效应”背后的数智化创新“延长线”

著名管理学家吉姆柯林斯在《从优秀到卓越》一书中提出“飞轮效应”&#xff0c;它指的是为了使静止的飞轮转动起来&#xff0c;一开始必须使很大的力气&#xff0c;每转一圈都很费力&#xff0c;但达到某一临界点后&#xff0c;飞轮的重力和冲力就会成为推动力的一部分&#xf…...

QT编程从入门到精通之十四:“第五章:Qt GUI应用程序设计”之“5.1 UI文件设计与运行机制”之“5.1.1 项目文件组成”

目录 第五章:Qt GUI应用程序设计 5.1 UI文件设计与运行机制 5.1.1 项目文件组成 第五章:Qt GUI应用程序设计...

(二分)730. 机器人跳跃问题

目录 题目链接 一些话 切入点 流程 套路 ac代码 题目链接 AcWing 730. 机器人跳跃问题 - AcWing 一些话 // 向上取整 mid的表示要写成l r 1 >> 1即可&#xff0c;向下取整 mid l r >> 1 // 这里我用了浮点二分&#xff0c;mid (l r) / 2&#xff0c;最…...

vue3使用nextTick

发现nextTick必须放在修改一个响应式数据之后&#xff0c;才会在onUpdated之后被调用&#xff0c;如果nextTick是放在所有对响应式数据修改之前&#xff0c;则nextTick里面的回调函数会在onBeforeUpdate方法执行前就被调用了。可是nextTick必须等到onUpdated执行完成之后执行&a…...

传统图像处理之颜色特征

博主简介 博主是一名大二学生&#xff0c;主攻人工智能研究。感谢让我们在CSDN相遇&#xff0c;博主致力于在这里分享关于人工智能&#xff0c;c&#xff0c;Python&#xff0c;爬虫等方面知识的分享。 如果有需要的小伙伴可以关注博主&#xff0c;博主会继续更新的&#xff0c…...

GPS问题调试—MobileLog中有关GPS关键LOG的释义

GPS问题调试—MobileLog中有关GPS关键LOG的释义 [DESCRIPTION] 在mobile log中,有很多GPS相关的log出现在main log和kernel log、properties文件中,他们的意思是什么,通过这篇文档进行总结,以便在处理GPS 问题时,能够根据这些log快速的收敛问题。 [SOLUTION] 特别先提醒…...

【企业管理】你真的理解向下管理吗?

导读&#xff1a;拜读陈老师一篇文章《不会向下负责&#xff0c;你凭什么做管理者&#xff1f;》&#xff0c;引发不少共鸣&#xff0c;“很多管理者有一种错误的观念&#xff0c;认为管理是向下管理&#xff0c;向上负责。其实应该反过来&#xff0c;是向上管理&#xff0c;向…...

Centos7 硬盘挂载流程

1、添加硬盘到Linux&#xff0c;添加后重启系统2、查看添加的硬盘&#xff0c;lsblksdb 8:16020G 0disk3、分区fdisk /dev/sdbmnw其余默认&#xff0c;直接回车再次查看分区情况&#xff0c;lsblksdb1 8:17 0 20G 0 part4、格式化mkfs -t ext4 /dev/sdb15、挂载mkdir /home/new…...

认识vite_vue3 初始化项目到打包

从0到1创建vite_vue3的项目背景效果vite介绍&#xff08;对比和vuecli的区别&#xff09;使用npm创建vitevitevuie3创建安装antdesignvite自动按需引入&#xff08;vite亮点&#xff09;请求代理proxy打包背景 vue2在使用过程中对象的响应式不好用新增属性的使用$set才能实现效…...

【Go】cron时间格式

【Go】cron时间格式 Minutes&#xff1a;分钟&#xff0c;取值范围[0-59]&#xff0c;支持特殊字符* / , -&#xff1b;Hours&#xff1a;小时&#xff0c;取值范围[0-23]&#xff0c;支持特殊字符* / , -&#xff1b;Day of month&#xff1a;每月的第几天&#xff0c;取值范…...

leetcode 55. 跳跃游戏

给定一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标。 示例 1&#xff1a; 输入&#xff1a;nums [2,3,1,1,4] 输出&#xff1a;true 解释&#xff1a;可以先跳 1 …...

Linux:文件流指针 与 文件描述符

目录一、文件描述符二、文件流指针三、缓冲区之前讲解过了IO库函数和IO接口&#xff0c;库函数是对系统调用接口的封装&#xff0c;也就是说实际上在库函数内部是通过调用系统调用接口来完成最终功能的。 库函数通过文件流指针操作文件&#xff0c;系统调用接口通过文件描述符操…...

基于FPGA实现正弦插值算法

1、正弦插值的算法分析 1.1 信号在时域与频域的映射关系 在进行正弦算法分析之前&#xff0c;我们回顾一下《数字信号处理》课程中&#xff0c;对于信号在时域与频域之间的映射关系&#xff0c;如下图。 对于上图中的原始信号x(t)&#xff0c;使用ADC对信号进行采样&#xff0…...

JavaWeb_会话技术

文章目录会话跟踪技术的概述Cookie概念Cookie工作流程Cookie基本使用发送Cookie获取CookieCookie原理分析Cookie的使用细节Cookie的存活时间Cookie存储中文SessionSession的基本使用概念工作流程Session的基本使用Session的原理分析Session的使用细节Session的钝化与活化Sessio…...

Reactor响应式流的核心机制——背压机制

响应式流是什么&#xff1f; 响应式流旨在为无阻塞异步流处理提供一个标准。它旨在解决处理元素流的问题——如何将元素流从发布者传递到订阅者&#xff0c;而不需要发布者阻塞&#xff0c;或订阅者有无限制的缓冲区或丢弃。 响应式流模型存在两种基本的实现机制。一种就是传统…...

[数据结构]栈的深入学习-java实现

CSDN的各位uu们你们好,今天千泽带来了栈的深入学习,我们会简单的用代码实现一下栈, 接下来让我们一起进入栈的神奇小世界吧!0.速览文章一、栈的定义1. 栈的概念2. 栈的图解二、栈的模拟实现三.栈的经典使用场景-逆波兰表达式总结一、栈的定义 1. 栈的概念 栈&#xff1a;一种…...

网络编程基础

1 互联网的本质硬件设备有了操作系统&#xff0c;然后装上软件之后我们就能够正常使用了&#xff0c;然后也只能自己使用。像这样&#xff0c;每个人都拥有一台自己的机器&#xff0c;然而彼此孤立。如何才能和大家一起愉快的玩耍&#xff1f;什么是网络&#xff1f;简单来说&a…...

华为OD机试题 - 数列还原(JavaScript)| 机考必刷

更多题库,搜索引擎搜 梦想橡皮擦华为OD 👑👑👑 更多华为OD题库,搜 梦想橡皮擦 华为OD 👑👑👑 更多华为机考题库,搜 梦想橡皮擦华为OD 👑👑👑 华为OD机试题 最近更新的博客使用说明本篇题解:数列还原题目输入输出示例一输入输出Code代码解析版权说明华为O…...

10-Oracle存储过程(创建,修改,使用及管理)

本章内容 1、我们为什么要用存储过程? 2、存储过程是如何定义和维护的? 3、我们如何调用存储过程? 4、存储过程中常用的复合数据处理方式及CTE 5、存储过程如何进行异常处理? 6、存储过程如何进行事务处理? 7、我们应如何优化存储过程? 1、我们为什么要用存储过程…...

创建线程的三种方法

文章目录1、创建一个类实现Runnable接口&#xff0c;并重写run方法。2、创建一个类继承Thread类&#xff0c;并重写run方法。3、实现Callable接口&#xff0c;重写call()方法&#xff0c;这种方式可以通过FutureTask获取任务执行的返回值。4、run()方法和start()方法有什么区别…...

第一章---Pytorch快速入门---第三节---pytorch中的数据操作和预处理

目录 1.高维数组 1.1 回归数据准备 1.2 分类数据准备 2. 图像数据 1.torchvision.datasets模块导入数据并预处理 2.从文件夹中导入数据并进行预处理 pytorch中torch.utils.data模块包含着一些常用的数据预处理的操作&#xff0c;主要用于数据的读取、切分、准备等。 常用…...

【代码随想录训练营】【Day38】第九章|动态规划|理论基础|509. 斐波那契数|70. 爬楼梯|746. 使用最小花费爬楼梯

理论基础 动态规划与贪心的区别并不是学习动态规划所必须了解的&#xff0c;所以并不重要。 想要了解动态规划算法题的特点&#xff0c;可以直接做下面三道入门简单题练练手感&#xff0c;找找感觉&#xff0c;很快就能体会到动态规划的解题思想。 总结成一句话就是&#xf…...

华为OD机试题 - 快递货车(JavaScript)| 机考必刷

更多题库,搜索引擎搜 梦想橡皮擦华为OD 👑👑👑 更多华为OD题库,搜 梦想橡皮擦 华为OD 👑👑👑 更多华为机考题库,搜 梦想橡皮擦华为OD 👑👑👑 华为OD机试题 最近更新的博客使用说明本篇题解:快递货车题目输入输出示例一输入输出Code解题思路版权说明华为O…...

前端——7.图像标签和路径

这篇文章&#xff0c;我们来讲解一下图像标签 目录 1.图像标签 1.1介绍 1.2实际展示 1.3图像标签的属性 1.3.1 alt属性 1.3.2 title属性 1.3.3 width / height 属性 1.3.4 border属性 1.4注意事项 2.文件夹 2.1目录文件夹和根目录 2.2 VSCode打开目录文件夹 3.路…...

java -- stream流

写在前面: stream流一直在使用&#xff0c;但是感觉还不够精通&#xff0c;现在深入研究一下。 stream这个章节中&#xff0c;会用到 函数式接口–lambda表达式–方法引用的相关知识 介绍 是jdk8引进的新特性。 stream流是类似一条流水线一样的操作&#xff0c;每次对数据进…...

【Spring6】| Bean的四种获取方式(实例化)

目录 一&#xff1a;Bean的实例化方式 1. 通过构造方法实例化 2. 通过简单工厂模式实例化 3. 通过factory-bean实例化 4. 通过FactoryBean接口实例化 5. BeanFactory和FactoryBean的区别&#xff08;面试题&#xff09; 6. 使用FactoryBean注入自定义Date 一&#xff1a…...