unity场景加载
SceneManager场景加载 需要引入UnityEngine.SceneManagement,其中分为两种方法,使用前需要再unity管理器中的file设置里的BuildSettings中加入需要管理的场景,两种加载方法可以使用下标(即BuildSettings中场景的排布顺序,从0开始),或者使用场景的名称(推荐)。可以通过传入参数LoadSceneMode.Single或者LoadSceneMode.Additive来指定加载方式,前者会卸载当前场景,后者则不会,默认为前者
同步加载LoadScene 无返回值,加载过程中可能会出现卡顿,卡顿时间随加载的场景的复杂度而定,一般不推荐使用
异步加载LoadSceneAsync 时LoadScene的异步版本,它允许游戏在加载新场景的同时继续运行其他任务。它会返回一个异步操作AsyncOperation,可以对加载的场景进行简单操作。
AsyncOperation带有四个可操作成员变量,主要的有三个:
1allowSceneActivation bool 类型
是否允许激活当前场景,true为允许,
1progress ...
reduce和accumulate函数
accumulate函数被定义在中,第一个作用为累加求和,另一个作用为对自定义类型数据的处理
累加求和1int sum = accumulate(vec.begin() , vec.end() , 42);
带有三个参数,前两个形参指定哟啊累加的元素范围,第三个形参则是累加的初值
accumulate函数将它的一个内部变量设置为指定的初始值,然后在此初值上累加输入范围内所有元素的值。accumulate算法返回累加的结果,其返回类型就是其第三个实参的类型。
自定义数据类型的处理可以用来直接计算数组或者容器中C++内置数据类型,例如:
1234#include <numeric> int arr[]={10,20,30,40,50}; vector<int> va(&arr[0],&arr[5]); int sum=accumulate(va.begin(),va.end(),0); //sum = 150
但是对于自定义数据类型,需要自己动手写一个回调函数来实现自定义数据的处理,然后让它作为accumula ...
Leetocde389:找不同
题目给定两个字符串 s 和 t ,它们只包含小写字母。
字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。
请找出在 t 中被添加的字母。
简单解法使用异或,这道题就相当于求某个出现奇数次的数一样,对于两个字符串,只有哪个被添加的字母多出一个,其它字母都出现了偶数次,所以可以使用异或。
123456789101112class Solution {public: char findTheDifference(string s, string t) { int ss = 0; for(int i=0;i<s.size();i++) { ss ^= s[i] ^ t[i]; } ss ^= t[t.size()-1]; return ss; }};
总结对于类似的题求某个奇数或者偶数,以及一些可以转变为类似的题型都可以使用异或的方法来解答
algorithm库函数
Count函数和Count_if函数参数:使用一对迭代器和一个值做参数
返回值:Count返回某个值出现的次数
Count_if返回某个区间中满粗指定条件的元素数目,可以使用谓词
谓词(predicate):是做某些检测的函数,返回用于判断的类型,指出条件是否成立
Reverse函数反转给定范围内的元素顺序
参数:(ForwardIt first, FowardIt last)左闭右开区间
ForwardIt为一个模板参数,代表迭代器的类型
例子:1234567891011121314int main() { std::vector<int> vec = {1, 2, 3, 4, 5}; // 使用reverse函数反转vec中的元素 std::reverse(vec.begin(), vec.end()); // 输出反转后的vec for(int n : vec) { std::cout << n << ' '; ...
动态规划
动态规划暴力递归转动态规划:
1.尝试写出递归
2.记忆化搜索
3.严格表结构
某些问题上记忆化搜索和严格表结构的时间复杂度相同
机器人运动问题:给定一个int参数n代表了n个位置(n大于1),再给一个int参数s代表机器人所在位置看(范围在1到n)int参数e代表机器人要去的最终位置(范围1到n)int参数k表示机器人必须走k步,机器人可往左走或右走,不可停留在原地,从s走到e必须走k步,求有多少种方法
优化前的递归方法:时间复杂度为O(2^k)
记忆化搜索优化:寻找可变参数根据可变参数数量制作对应多维数组(或者哈希表)作为缓存结构,初始值为-1
时间复杂度为O(k*n)
严格表结构优化:根据最初的递归寻找每个位置所依赖的表格位置,例如当k为4,s为2,n为5,e为4时,列出下列表格,行代表剩余步数,列代表所在位置
例题2:给定一个长度为n的正整数数组,数组的每个位置代表该位置硬币的面值,给定一个值aim,求组成这个aim这个值的最少硬币数
以下为给定例子
递归尝试:
记忆搜索法:增加缓存
暴力递归
暴力递归
汉罗塔问题:
打印一个字符串的全部子序列,包括空字符串字符串中每个字符都会有要和不要两种情况
打印一个字符串的全部排列,要求不要出现重复的排列
例题1:
逆序一个栈,要求不能使用额外数据结构
f函数的过程:
reverse函数过程:
例题2:
例题3:
尝试方式,从左往右对于每个物品都是要或者不要,可枚举出所有情况
哈希函数和哈希表
什么是哈希函数:哈希函数性质:
1)输入的值是无穷大的,输出的值有限制
2)相同的输入值必得到相等的输出值
3)不同的输出也可能得到相同的输出值(被称为哈希碰撞)
第四条如下:
不管给定多少条数据得到多少条输出值,假如s圈为范围,每一个输入值都相当于在圈内点一个点,当用一个圆随机圈几个时,圆内所包含的点一样
哈希函数使用:
给定一组数据,通过f哈希函数计算得到另一组数据,再同时余上m得到第三组数据,若能保证第二组数据在s域上均匀分布,这在0到m-1上也均匀分布
假设有一个大文件,文件里都是无符号整数(范围0到2^32-1),大文件总共有40亿个,给你1g的内存,给定返回出现数次数最多的是哪个
将所有得数经过哈希函数变换之后,余上100将所有的数的范围控制在0到100之间,再存入哈希表,出现次数最多的就是
哈希表的实现:基于哈希函数
当某个值后面挂的链表超过一定的长度时,根据哈希函数的性质可以确定其它链的长度接近这个值,这是进行扩容,防止之后查询时间过长
每次扩容代驾:若已加入n个字符串,这是经历了logn次,增加n个,代价为o(n*logn)
前缀树,贪心算法和N皇后
前缀树
前缀树的点的数据结构:
pass:记录创建前缀树时,该节点被经过多少次
end:记录该节点是多少个字符串的结尾
nexts:记录有多少条路从该节点出发
查询该字符串加入过几次:
查询加入的字符串中,有几个是以pre这个字符串为前缀的:
删除某个字符串:
贪心算法:
例题1:
按照时间结束早的会议先安排
字典序:将两个字符串按照字典(并非数据结构,为现实中的字典)的顺序排列
给定一个字符串数组,使其按照某种顺序拼接后使其字典序最小,使用的贪心策略为:两个字符串a,b,若ab结合字典序小于等于ba结合则a放前,否则b放前
例题2:
使用哈夫曼编码
哈夫曼编码:
如上图,给定一个数组,将所有树压入,小根堆,1)弹出两个数,结合存入cur中,2)将结合后的数压入小根堆,重复1)2)直至小根堆中只剩一个数为止,便可得到最小代价
代码实现:
例题3:
N皇后问题:
时间复杂度为O(N^N),可以进行常数级别上的优化(使用位运算来加速)
优化后
图
图的表达
邻接表表达方式
存储方式:有一张表,从第一行开始先存A的直接邻居(C,D)第二行存B的直接邻居,依次存玩每个点(存放有权值的图,只需在表中对应位置加个数据项用来存放权值即可)
邻接矩阵表达方法:
一个二维数组每一行代表每一个点,每一列也代表每一个点,根据图将点到点之间的距离存入对应位置,无法到达存无穷
使用点集和边集表达图
nodes:表示点集。edges:表示边集
in:表示入度。on:表示出度。next:表示从该点出发所指向的点。edges:表示属于该点的边
weight:表示权重。from:表示从哪个点出发。to:表示指向哪个点
入度:代表有多少个边指向这个点
出度:代表这个点指向多少个点
无向图的出度和入度想等
图的表达方式的转化(将给定的表达方式转换成熟悉的表达方式)
例如给定以上图所示的表达方式每行表示权值,起始点,终点
代码所示的每行为起始点,终点,权值
宽度优先遍历:
从A开始先存入队列和set中(set用于存放被处理过的点,防止无限循环)1)若队列不为空从中弹出一个数并做相应处理,2)遍历弹出的点的直接邻居若不在set中存入队列和set重复1)2)操 ...
树
先序遍历:对于每一个子树,先输出头节 点,再输出左节点,最后输出右节点
中序遍历:对于每一个子树,先输出左节点,再输出头结点,最后输出右节点
后序遍历:对于每一个子树,先输出左节点,再输出右节点,最后输出头结点
递归实现,主要是输出value语句的放置地方不一样,放在遍历左右子树之前为先序,放在中间为中序,放在后面为后序
不使用递归实现:先序遍历:
创建一个栈,按照图中1)2)3)4)顺序运行
后序遍历:
创建两个栈,按照1)2)3)顺序重复执行,打印收集栈
中序遍历:
创建一个栈,把每棵子树整颗树的左边界进栈,依次弹出过程中打印,若有右节树存入栈重复
深度优先遍历:就是二叉树的先序遍历
宽度优先遍历:非递归写法:创建一个队列,先把头结点放入队列,1)弹出并打印,2)先存左节点再存右节点为空不放,重复1)2)
计算树的宽度:
准备一个队列和一个map先把头结点放入,map中存节点以及节点所在层数,在代码while后面加一个return Math.max(max, CurLevelNodes)
不使用哈希表(map):
一个队列,两个node类型的指针,存当前层最后一个节点,一 ...