第一章 基础算法(一)ACwing 快速,归并,二分

2023-11-08

第一章 基础算法(一)

一、内容概述

主要思想掌握,深刻的理解

代码模板理解以及背过(掌握思想)

模板题目练习

理解 + 记忆

1. 排序:

  • 快排
  • 归并排序

2. 二分

  • 整数二分
  • 浮点数二分

二、快速排序

快速排序的主要思想是基于分治的,第一步就是是确定分界点,重点是调整范围。

请添加图片描述

请添加图片描述

1. 双指针思想(比以上那种暴力的做法优美一点)

(1)思想:
  • 无需开辟额外的空间
  • 有两个指针i,j,分别在最左端和最右端
  • 然后i,j两个指针往中间走
  • i往中间走,直到遇到第一个大于x的数,然后停下来(因为大于x的要放在右半边)【遇到小于x的数i就继续往下走】
  • j往中间走,直到遇到第一个小于x的数,然后停下来(小于x的数放在左半边)
  • 此时将i所指的数与j指的数交换一下,那么i指的新的数就是小于x的数,j指的新的数就是大于x的数,归位了。
  • 接着重复这个过程,i,j往中间走;
  • 直到i,j相遇,就可以把区间一分为二【左边小于x,右边大于x】
  • 会发现,任何时刻i左边的数都是小于x的,j右边的数都是大于x的
  • 当两个指针相遇或是穿过之后,这两个指针左边的数就是大于等于x,右边的数就是大于等于x,完美的分成两个区间
  • 【x 归位一次,就分好一次区间,不断递归左右两个区间,直到所有的x归位】
(2)快排模板:ACWING 785.快速排序
#include <bits/stdc++.h>
using namespace std;

const int N = 1e6 + 10;
int n;
int q[N];
void quick_sort(int q[], int l, int r)
{
	if (l >= r) return ; // 如果数组一个数都没有或者只有一个数,就不用排序、
	
	//设置两个指针,以及分界点x 
	int x = q[l], i = l - 1, j = r + 1; //这里两个指针我们设置在数组外,这样我们可以不管,直接让二者都往里面走
	
	//开始循环
	while (i < j)
	{
		//只有两个指针没有碰到才可以继续走
		do ++i; while (q[i] < x); //当 q[i] < x就继续往下走
		do --j; while (q[j] > x); //当q[j] > x就继续往下走,直到j指针指到一个<=x的数,说明应该放在左边
		
		//判断i, j两个指针未碰到就可以交换
		if (i < j) swap(q[i], q[j]); 
	} 
	//一次循环结束后,分界点x归位,接着继续分别递归左右两边
	quick_sort(q, l, j);
	quick_sort(q, j + 1, r); 
}
int main ()
{
	scanf ("%d",&n); // 输入有几个数
	for (int i = 0; i < n; ++i)
	{
		scanf ("%d",&q[i]); // 输入数组 
	} 
	
	// 快速排序
	quick_sort(q, 0, n - 1);//范围0 - n-1
	for (int i = 0; i < n; ++i) printf ("%d ",q[i]);
	printf ("\n");
	return 0; 
}
  • quick_sort中注意一下:写i,最好就不要用q[l],否则会有边界问题,改成i,如下:

    int x = q[r];
    //或者
    int x = q[(l + r + 1) / 2]; // 一定要上取整,一定不能取到l这个边界上
    quick_sort(q, l, i - 1);
    quick_sort(q, i, r); 
    //当我们这里用i时,一定不能取到l左边界,否则就会死循环
    
  • 举个实例,思考一下:

/* 
例如:
2
1 2
*/
- 这时若是x = q[l],则是x = 1;
- 首先,i指向第一个点1前面,j指向第二个点2后面
- 用的是 do-while 两个指针都会先++移动一下
- 第一个点不满足小于x,i++,指向第一个点1;
- 第二个点满足大于x,且之前++ 过了,再往前走,指向第一个点1,两个指针相遇
- 此时i=0,等于左边界l;
- 此时 quick_sort(q, 0, -1); // 左边没有数,结束了
- 此时 quick_sort(q, 0, 1); // 下次还会是[0, 1]
- 就会一直死循环,无限递归下来
- 边界问题
- 同理用j的时候就不要用r(左不对左,右指针不对右边界)
#include <bits/stdc++.h>
using namespace std;

const int N = 1e6 + 10;
int n;
int q[N];

void quick_sort(int q[], int l, int r)
{
   if (l >= r) return ;
   int x = q[r];
   int i = l - 1;
   int j = r + 1;
   while (i < j)
   {
       do ++i; while (q[i] < x);
       do --j; while (q[j] > x);
       if (i < j) swap(q[i], q[j]);
   }
   quick_sort(q, l, i - 1);
   quick_sort(q, i, r);
}

int main ()
{
   scanf ("%d", &n);
   for (int i = 0; i < n; ++i)
   {
       scanf ("%d", &q[i]);
   }
   quick_sort(q, 0, n - 1);
   for (int i = 0; i < n; ++i)
   {
       printf ("%d ",q[i]);
   }
   printf ("\n");
   return 0;
}
  • 在最新的ACwing 785 上,数据更新了,令分界点 x = q[(l + r + 1) / 2]; 可以通过本题

三、归并排序

基于思想: 分治

  • 快排是先分完,再递归左右两边;
  • 归并是先递归左右两边,再去做一些其他的操作

1. 归并排序的思想:

请添加图片描述

  • 第一步:确定分界点:mid = (l + r)/ 2;
  • 第二步:递归排序left,right左右两边;
  • 第三步:左右两边有序后,再归并 —— 将两个有序的数组合二为一;
(1)如何归并?★
  • 双指针,分别指向两个需要合并的数组;

  • 然后,分别将两个指针指向的数字对比,较小的放在最终的结果数组里面,然后指向较小数的那个指针后移,接着比对,重复此过程;

  • 不断比对,指针不断往后移;若是其中一个指针指到末尾(无),而另一个指针指向的数组还有剩下,则将这些全部放到结果数组中(说明这些就是大的数)

  • 稳定是指:原序列中两个数的值是相同的话,在排完序后相对位置要是不发生变化的话,排序就是稳定的

  • 归并排序稳定,快速排序一般不稳定;

  • 快排平均时间复杂度:O(nlogn);

  • 归并排序:O(nlogn);n / log2n次2才等于1

  • 请添加图片描述

(2)ACwing 787. 归并排序
#include <bits/stdc++.h>
using namespace std;

const int N = 1e6 + 10;

int n;
int q[N]; //数据 
int temp[N]; //存放临时数据数组 

void merge_sort(int q[], int l, int r)
{
	if (l >= r) return; //如果数组里面只有一个数据或者没有,直接返回退出函数
	
	//先确定分界点 
	int mid = l + r >> 1; // 位运算  /2
	
	//递归排序左右两边
	merge_sort(q, l, mid); //递归排序左边 
	merge_sort(q, mid + 1, r); //递归排序右边
	
	//归并
	int k = 0; //归并的个数
	// 两个指针 
	int i = l; 
	int j = mid + 1; 
	// 分别指向排完序的左右半边,接着进行合并
	//合并是对有序的数组合并 
	while (i <= mid && j <= r)
	{
		// 如果i指针指向的数小于j指针指向的数,则将i指向的数插入临时数组里面,i与k往下走
		//同理 j k 
		if (q[i] <= q[j]) temp[k++] = q[i++];
		else temp[k++] = q[j++];	
	} 
	// 当i还没有走完,j以及结束了,则把剩余的数组放在临时数组temp中 
	while (i <= mid) temp[k++] = q[i++];
	// 同理 右半边 
	while (j <= r) temp[k++] = q[j++];
	
	//把临时数组整理 ,重新赋值回q数组中 
	for (i = l, j = 0; i <= r; ++i, ++j)
	{
		q[i] = temp[j];	
	} 
} 

int main ()
{
	scanf ("%d", &n);
	for (int i = 0; i < n ; ++i)
	{
		scanf ("%d",&q[i]);
	}
	merge_sort(q, 0, n - 1);
	for (int i = 0; i < n ; ++i)
	{
		printf ("%d ",q[i]);
	}
	printf ("\n");
	return 0;
}

四、二分(整数二分和浮点数二分)

1. 整数二分:(背模板)

本质:与单调性无关,但是有单调性一定有二分。【可以二分的题目不一定有单调性】;

二分的本质是边界,假设给我们一个区间,然后在这个区间上定义了某种,使得这个性质在右半边是满足的,在左半边是不满足的;

整个区间可以被一分为二;

只要整个区间里可以找到这个性质,就可以用二分把这个边界点二分出来;

(1)第一种情况

请添加图片描述

  • 假设想二分出红色这个点;
  • step one:先让中间点mid = (l + r) / 2;
  • 假设性质是红色这个性质,那么先检查mid是否满足红色这个性质,if (check(mid));
  • 如果结果为true说明满足这个红色性质,就在红色块找(mid在红色区间),则答案在[mid, r]之间【包含mid,mid可以取到边界点】;更新方式为[l, r]区间更新为[mid, r]区间;【l = mid即可】
  • 如果为false,则说明不满足红色性质,则在绿色区间找,则答案区间为[l, mid - 1];【mid - 1 是因为此时的check是false,则答案边界一定是不含mid的,从mid - 1开始】;更新方式为[l, r]区间更新为[l, mid - 1]区间;【r = mid - 1 即可】

请添加图片描述

  • 如果是以上两个区间【mid在右半边】,则mid = (l + r + 1)/ 2;
(2)第二种情况
  • 假设想二分出绿颜色这个点;

  • step one:先让中间点mid = (l + r) / 2;

  • 假设性质是绿色这个性质,那么先检查mid是否满足绿色这个性质,if (check(mid));

  • 若是true, 则mid 在绿色块区间,边界点所在区间为[l, mid];【r = mid】;

  • 若是false,则mid 在红色块区间,边界点所在区间为[mid + 1, r];【l = mid + 1】;

  • 若是这两个区间【mid在左半边】,则mid = (l + r) / 2;

  • (C++中整数除法下取整)

(3)步骤
  • first:先想一个mid;
  • second:写一个check函数,根据check情况,该如何更新区间;【若是l = mid & r = mid - 1,则mid = (l + r + 1) / 2】,【若是r = mid & l = mid + 1,则mid = (l + r ) / 2】
  • third:根据区间的划分,去求mid;
(4)例子:ACwing 789 数的范围
给定一个按照升序排列的长度为 n 的整数数组,以及 q 个查询。

对于每个查询,返回一个元素 k 的起始位置和终止位置(位置从 0 开始计数)。

如果数组中不存在该元素,则返回 -1 -1。

输入格式
第一行包含整数 n 和 q,表示数组长度和询问个数。

第二行包含 n 个整数(均在 110000 范围内),表示完整数组。

接下来 q 行,每行包含一个整数 k,表示一个询问元素。

输出格式
共 q 行,每行包含两个整数,表示所求元素的起始位置和终止位置。

如果数组中不存在该元素,则返回 -1 -1。

数据范围
1≤n≤100000
1≤q≤10000
1≤k≤10000
输入样例:
6 3
1 2 2 3 3 4
3
4
5
输出样例:
3 4
5 5
-1 -1
#include <bits/stdc++.h>
using namespace std;

const int N = 1e6 + 10;
int n, m;
int q[N];

int main ()
{
	scanf ("%d%d",&n, &m);
	for (int i = 0; i < n; ++i)
	{
		scanf ("%d", &q[i]);
	}
	// 要查找的数的起始位置和终止位置	
	while (m--)
	{
		int x;
		scanf ("%d", &x); 
		
		// 初始区间的范围 
		int l = 0, r = n - 1;
		// 寻找起始位置边界
		// 思考check函数 
		while (l < r)
		{
			int mid = l + r >> 1;
			//数组升序排列 
			// 若是q[mid]的值比x大 ,则x在左半边,r = mid 
			if (q[mid] >= x) r = mid;
			else l = mid + 1;	
		} 
		
		// 新 l == r 
		//从循环出来,若 !=x则无这个数 
		if (q[l] != x) cout << "-1 -1" << endl;
		else 
		{
			cout << l << ' ';
			int l = 0;
			int r = n - 1;
			while (l < r)
			{
				int mid = l + r + 1>> 1;
				// 找终止位置,则换一个check判断;【完了之后还要看看mid】 
				// 若为true ,则说明边界点在右半边 
				if (q[mid] <=x)
				{
					l = mid; 
				}else r = mid - 1; //则前面 int mid = l + r + 1>> 1; 
			}
			// 其实出循环,l与r就会碰到
			cout << l << endl; 
		} 
	}
	return 0;	
} 
(5)二分的主要思想
	在一个区间内部,去二分我们的边界,【每一次会把长度缩写一半】每一次都要选择答案所在的区间去进行下一步的处理;(每一次都能 保证我们的区间里有答案,答案都会被区间覆盖掉)
    当我们区间是1的时候,这个区间里的数就一定是答案;
    二分时(模板)一定是有解的;无解是相对于题目来说的,比如ACwing 789这一个例子;(我们定义的这个性质是一定有边界的,一定能把这个边界二分出来)     

2. 浮点数二分

(1)以求平方根为例
//求平方根 
#include <bits/stdc++.h>
using namespace std;

int main()
{
	// 输入待求平方根的数 
	double x;
	cin >> x;
	
//	确定边界 
	double l = 0;
	double r = x; 
//	因为是浮点数,不能简单的用 = 
//	当 r - l <= 1e-8 认为“相等”跳出循环 
	while (r - l > 1e-8)
	{
		double mid = (l + r) / 2; //先找出mid
		if (mid * mid >= x)
		{
//			说明平方根在左半边 比 mid 小 但满足可以取到mid
			r = mid; 
		} 
		else 
		{
//			否则,直接让l = mid 就行,因为是浮点数
			l = mid; 
		}
	} 
//	%lf 默认是6位,所以前面是1e-8(比要保留的个数多两位,比较保险) 
	printf ("%lf", l);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

第一章 基础算法(一)ACwing 快速,归并,二分 的相关文章

  • 运行时间为 O(n) 且就地排序的排序算法

    有没有运行时间为O n 并且还分类到位 在某些情况下 最好的情况是 O n 但这可能是因为项目集合已经排序 你正在看 O nlogn 一些较好的平均值 话虽如此 排序算法的 Wiki 还是相当不错的 有一个表格比较了流行的算法 说明了它们的
  • 更合适地说插入未排序动态数组的摊销 O(1) 与 O(n) ?

    这属于 stackoverflow com help on topic 中的 软件算法 在本例中 是一种将项目添加到动态未排序数组的软件算法 This is chart we made in class about the runtimes
  • Google 文档如何处理编辑冲突?

    我一直在尝试编写自己的 Javascript 编辑器 其功能类似于 Google Docs 允许多人同时使用 我不明白一件事 假设用户 A 和用户 B 直接相互连接 网络延迟为 10 毫秒 我假设编辑器使用 diff 系统 据我了解 Doc
  • 一种良好且简单的随机性测量方法

    获取一长整数序列 例如 100 000 个 并返回序列随机性的测量值的最佳算法是什么 该函数应返回单个结果 如果序列并非完全随机 则返回 0 如果完全随机 则返回 1 如果序列有点随机 它可以给出介于两者之间的东西 例如0 95 可能是一个
  • 计算字符串的所有子串中子序列的出现次数

    我想编写一个算法来计算字符串的所有子字符串中字符子序列 不相交 出现的总数 下面是一个例子 字符串 jabcohnnyjohnny 后续 约翰尼 包含子序列的子字符串 jabcohnny jabcohnnyj jabcohnnyjo jab
  • 素数生成器算法

    我一直在尝试解决素数生成算法的SPOJ问题 这是问题 彼得想为他的密码系统生成一些素数 帮助 他 你的任务是生成两个给定之间的所有素数 数字 Input 输入以单行中测试用例的数量 t 开始 t Output 对于每个测试用例 打印所有素数
  • 简单的排名算法

    我需要创建一个民意调查 按照项目的好坏顺序创建一个排名列表 我打算向每个用户展示两个项目 让他们选择一个他们认为更好的项目 然后多次重复这个过程 它有点类似于您在社交网络电影 我应该如何根据收到的答案对项目进行排名 看着那 这ELO国际象棋
  • 检查有效的 IMEI

    有人知道如何检查有效的 IMEI 吗 我找到了一个可以检查此页面的功能 http www dotnetfunda com articles article597 imeivalidator in vbnet aspx http www do
  • Python Pandas:沿一列比较两个数据帧,并返回另一个数据帧中两个数据帧的行内容

    我正在处理两个 csv 文件并作为数据框 df1 和 df2 导入 df1 有 50000 行 df2 有 150000 行 我想将 df2 的 时间 与 df1 求时间差并返回所有列的值 对应相似的行 保存在df3中 时间同步 例如 35
  • 在任意时间范围内找到最佳日/月/年间隔的算法?

    如果您有时间表 请说 March 19 2009 July 15 2011 是否有一种算法可以将该时间范围分解为 March 19 2009 March 31 2009 complete days April 1 2009 December
  • LRU算法,实现这个算法需要多少位?

    我有一个关于 LRU 算法的小问题 如果您有一个包含四个块的高速缓存 那么需要多少位来实现该算法 假设您指的是 4 路组关联缓存 完美 LRU 本质上是按照使用顺序为每一行分配一个精确的索引 您也可以将其视为 年龄 因此 4 个元素中的每一
  • 重写修改后的 goto 语义的算法

    我有一大堆使用旧的自行设计的脚本语言编写的遗留代码 我们将它们编译 翻译成 javascript 该语言有条件跳转 跳转到标签 与普通 goto 语句的区别在于 不可能向后跳转 该语言中没有嵌套的 if 语句或循环 由于 javascrip
  • 这个函数(for循环)空间复杂度是O(1)还是O(n)?

    public void check 10 for string i list Integer a hashtable get i if a gt 10 hashtable remove i 这是 O 1 还是 O n 我猜测 O n 但不是
  • 优化计算中使用的 # 个线程的算法

    我正在执行一个操作 我们将其称为CalculateSomeData CalculateSomeData 在连续的 代 中运行 编号为 1 x 整个运行中的代数由CalculateSomeData 的输入参数固定 并且是先验已知的 完成一次生
  • 覆盖二维平面上给定点的最小圆

    问题 覆盖 2D 平面上给定 N 个点的圆的最小可能直径是多少 解决这个问题最有效的算法是什么 它是如何工作的 这是最小圆问题 http en wikipedia org wiki Smallest circle problem 请参阅参考
  • 排序矩阵的选择算法

    这是谷歌面试问题 给定一个 N N 矩阵 所有行均已排序 所有列均已排序 找到矩阵的第 K 个最大元素 在 n 2 中执行它很简单 我们可以使用堆或合并排序 n lg n 对它进行排序 然后得到它 但是有没有更好的方法 比 n lg n 更
  • 你能用 C# 编写一个同样优雅的排列函数吗?

    我非常喜欢这个 6 行解决方案 并尝试在 C 中复制它 基本上 它会排列数组的元素 def permute xs pre if len xs 0 yield pre for i x in enumerate xs for y in perm
  • 实时战略战争游戏人工智能算法

    我正在设计一款实时策略战争游戏 其中 AI 将负责控制大型六边形地图上的大量单位 可能超过 1000 个 一个单位有许多行动点 可以用于移动 攻击敌方单位或各种特殊行动 例如建造新单位 例如 一辆拥有 5 个行动点的坦克可以花费 3 个行动
  • 使用递归返回嵌套列表中第二小的数字

    我必须归还第二小的使用递归的 python 列表中的数字 以及no loops 我所做的是创建一个辅助函数 它返回列表中 最小 第二小的 值的元组 然后我只取tuple 1 in my second smallest func def s
  • 从列表中选择项目以求和

    我有一个包含数值的项目列表 我需要使用这些项目求和 我需要你的帮助来构建这样的算法 下面是一个用 C 编写的示例 描述了我的问题 int sum 21 List

随机推荐

  • Java泛型机制

    Generics 泛型 一个接口或类可能被声明为一个或者多个类型的参数 该类或接口写在尖括号中 提供的实体类需要属于该接口或类 Generic Programming 泛型编程 泛型类可以是编码更安全以及方便阅读 尤其是在集合类中 Java
  • 【隧道篇 / PPTP&L2TP】(5.2) ❀ 01. PPTP & L2TP 连接 ❀ FortiGate 防火墙

    简介 虽然有SSL 但是因为要安装 FortiClient 客户端软件 很多人还是喜欢用PPTP或L2TP 理由很简单 那就是只要是Windows就可以连 不用安装其它软件 PPTP 与 L2TP 协议的联系与区别 PPTP Point t
  • JAVA三种多数据源配置详解(一)

    在大型项目的开发中 我们可能因为微服务 分布式 集群等架构的影响 而需要到不同的数据库中去查询需要对应的数据 这时 单一的数据库配置就无法满足业务需求 下面我会介绍集中不同场景下的多数据源配置 大家可以根据自身情况进行选择和实现 yml文件
  • 纪念古龙诞辰:论古龙的江湖为何没有一“tong”?

    古龙 nbsp 原名熊耀华 1938年6月7日生于香港 武侠小说家 新派武侠小说泰斗 代表作品 多情剑客无情剑 绝代双骄 楚留香传奇 武林外史 等 有人喜欢金庸 也有很多人喜欢古龙 他们之间的同与不同 以及那些至今仍然令我们备受感动的地方
  • vue中a标签下载本地文件-未找到【已解决】

    首先看一下我的情况 如下 目录如图 代码如下 a href public kjxz pptx 课件下载 a 一切看起来很正常 但是结果如下 然后我搜了一下发现原来href路径的问题 原来使用 public kjxz pptx 文件会找不到
  • 漫步IOS--三目运算符、switch、枚举

    1 三目运算符 三目运算符的定义 表达式1 表达式2 表达式3 例如 a gt b 2 5 三木运算符也是有返回值的 返回值等于对应的表达式的返回值 2 switch 在c语言中 switch只支持整型 但是这里的整型包括 整型 字符 布尔
  • 如何将文档上传到 ChatGPT

    OpenAI 一直在为 ChatGPT 添加几个有趣的功能 包括对网页浏览和插件的支持 但是 仍然没有办法本地上传文档并根据其上下文提出问题 当然 有些用户可以在他们的数据上训练 AI 聊天机器人 但并不是每个人都了解如何设置工具和库 因此
  • 华为OD机试 C++ 去除多余空格

    题目 你需要写一个功能 它能处理一段文本 去除其中不必要的空格 但是如果这些空格被一对单引号包围起来 就保留它们不变 同时 你还要调整一些特定词汇的位置 这些词汇的位置会以坐标的方式给出 坐标要基于新的文本 特别注意 关键词的位置一定不是空
  • Unity 入门 Input 类

    1 获得键盘 Input GetKey KeyCode A Input GetKeyDown KeyCode A Input GetKeyUp KeyCode A 2 获得鼠标信息 Input mousePosition 鼠标位置 Inpu
  • 关系型数据库是如何运作的

    一说到关系型数据库 我总感觉缺了点什么 如果你尝试透过 关系型数据库是如何运作的 的关键词句来进行搜索 其搜索结果是少量的而且内容是简短的 难道说是由于它已经太老旧而已经不再流行吗 作为一名开发者 我讨厌使用我不明白的技术 此外 关系型数据
  • s、x、t -learner

  • DICOM之Transfer Syntax

    Transfer Syntax A Transfer Syntax is a set of encoding rules able to unambiguously represent one or more Abstract Syntax
  • ChatGPT在线个人小助手应用搭建

    ChatGPT在线个人小助手应用搭建 在线体验 点我在线体验 因为openAI账户申请后会默认有18美元的账户 openAI每次调用大概会花掉0 01美元 所以为了防止恶意刷api 无意义聊天 页面做了密码限制 如果密码不对 是不会启用op
  • mysql存储引擎层和服务器层,MySQL底层架构原理,工作流程和存储引擎的数据结构讲解...

    数据库 DataBase 是存放用户数据的地方 当用户访问 操作数据库中的数据时 需要数据库管理系统的帮助 数据管理系统的全称是DataBase Management System 简称DBMS 通常情况下我们会把数据库和数据库管理系统笼统
  • 网页端无法复制粘贴的解决方案

    由于瑞格系统无法复制粘贴 写java代码比较难受 所以就找了一些方法来解决网页端无法复制粘贴的问题 1 打开浏览器的设置界面 并打开拓展程序 2 在拓展程序中选择左上角的拓展程序 并打开Chrome网上应用商店 3 在Chrome网上应用商
  • 多线程JUC并发篇常见面试详解

    文章目录 1 JUC 简介 2 线程和进程 3 并非与并行 4 线程的状态 5 wait sleep的区别 6 Lock 锁 重点 1 Lock锁 2 公平非公平 3 ReentrantLock 构造器 4 Lock 锁实现步骤 7 syn
  • 百炼成钢;JavaScript逆向九大专题详解

    JavaScript是一种脚本语言 通常用于在Web浏览器中编写交互式前端应用程序 它是一种解释性语言 可以在客户端 浏览器 和服务器端 Node js 上运行 JavaScript可以用于创建动态网页 Web应用程序 游戏 移动应用程序等
  • unity 获取鼠标键盘

    unity 获取鼠标键盘 在做项目中我们经常会用到鼠标键盘 那么怎么去获取鼠标键盘呢 接下里我带大家了解一下 首先是获取鼠标 大家记住无论是获取鼠标还是获取键盘都要用到unity中的一个小小的组件首先在unity上方的选项卡中选择edit
  • RocketMQ(三) broker启动

    RocketMQ源码版本V5 0 0 可兼容之前的版本 因为整理资料的时候 之前的版本 和V5版本有所出入 核心流程基本还是大同小异的 此前已经总结了NameServer的启动流程源码 现在来了解Broker的启动流程 在RocketMQ启
  • 第一章 基础算法(一)ACwing 快速,归并,二分

    第一章 基础算法 一 一 内容概述 主要思想掌握 深刻的理解 代码模板理解以及背过 掌握思想 模板题目练习 理解 记忆 1 排序 快排 归并排序 2 二分 整数二分 浮点数二分 二 快速排序 快速排序的主要思想是基于分治的 第一步就是是确定