- 博客(190)
- 收藏
- 关注
原创 Lecture 3 | Stanford CS193p 2023
Model(模型)负责处理业务逻辑和数据。提供数据给ViewModel,并接收ViewModel传来的业务操作请求。ViewModel(视图模型)位于Model与View之间,起到连接和协调作用。包含界面的状态、业务逻辑以及界面的交互处理。ViewModel负责从Model获取数据,并以更便于View使用的方式进行数据封装或转换。当数据发生变化时,ViewModel会通知View去更新界面。View(视图)只负责界面的展示,响应用户操作,将操作交由ViewModel处理。
2025-04-01 13:03:46
666
原创 SwiftUI学习笔记day2---Stanford lecture2
从指针的角度看,@State 的底层实现核心在于使用一个存储盒子(堆上的内存块)来持有状态数据,并在视图中通过一个不变的指针来引用这个盒子。这样,即使视图(值类型)的实例不断重建,指向状态的指针依然稳定,保证了状态的持久性和一致性。同时,状态的更新通过修改该内存区域的数据来完成,进而触发 SwiftUI 内部的依赖追踪和视图刷新机制,实现了高效的响应式界面更新。SwiftUI 利用 ForEach 与 Array 的结合,实现了基于数据驱动的动态视图生成。
2025-03-20 16:14:50
778
原创 SwiftUI学习笔记day1---Stanford lecture1
首先你必须拥有一个apple id(最普通的apple id就可以,因为我们只是学习并不需要上架app)打开Xcode的欢迎界面直接点击new project即可:继续选择app:可以看到Xcode还可以创建其他类型的项目不过我们这里先创建一个app类型的工程接下来有一些信息需要填写一下,以下是信息的含义和注意事项:注意:一旦正式发布到 App Store,Bundle Identifier 将不可更改,要事先规划好。其实我已经使用过一段时间的Xcode了,但是Xcode其实还有很多功能还没有用到,这
2025-03-12 23:06:59
728
原创 Leetcode:h指数
这里的思路和方法一略有不同,首先第一个循环内是计数排序的排序过程,第二个循环内从后往前遍历计数排序的数组counter,每次将counter[i]累加起来,当tot >= i的时候则i为答案。这里的原理可以理解为tot为至少被引用i次的论文数量总和,然后i是被引用次数,当这两个值相交时就为h数。然后这两个函数分别是单调递减和单调递增的,所以如果他们有交点的话那么交点处的citations[i]就是h指数(这是大多数情况下),实际实现的情况会有一些额外的情况,例如没有交点那么h指数就是论文个数总和等。
2025-01-04 16:08:18
1264
原创 划分为k个相等的子集
若是dfs已经返回了一个true那么已经找到一种情况满足了划分要求,因为这里只需要返回结果,所以没必要继续dfs了直接返回true即可,否则的话继续找数组中的下一个元素进行dfs。②dp[s] == false: 这里进行判断以为这这个选择情况已经被dfs过了,已经被dfs过但是却没有成功划分,那么证明这个状态已经是失败的所以直接返回false;中状态因为利用了记忆化搜索,所以每种状态一定只会dfs一次,每个状态的dfs最坏情况下都会遍历一遍数组,所以整体的时间复杂度为O(n *
2024-08-27 00:14:06
791
原创 LeetCode:反转区间内的链表
时间复杂度:O(N),这里找四个节点的位置,和反转链表都是O(N)级别,所以时间复杂度就是O(N)级别。时间复杂度:O(N), 最坏情况下也只会遍历一次,比方法一的时间复杂度更优。空间复杂度:O(1),这里在原地进行反转,只使用了额外的四个指针变量。这里的思路简单来说就是:对于反转的区间通过头插的方式进行反转。Step1:当前节点的next指向next节点的next。Step3:pre节点的next指向next节点。Step2:next节点的next指向当前节点。Step2:将分离出的链表进行反转。
2024-08-24 20:55:10
430
原创 带你学会Git必会操作
我们发现这里的merge的模式好像不是fast-forward模式:因为之前我们的合并如果是fast-forward模式的话,合并成功之后会有fast-forward的提示,那么其实这里git默认给我们采用了no-ff,也就是非fast-forward模式,这两种模式有什么区别呢?首先,其实不管是暂存区还是对应的分支,其实内部都是维护了对应的索引而不是文件/对象。代表要拉取的远程的master分支,冒号后面代表要拉取到本地的分支,当本地分支名和远程分支名一致的时候可以省略掉本地分支名。
2024-07-28 23:32:30
916
2
原创 牛客热题:最长回文子串
表示以A[i],A[j]为头尾的字符串是否是回文字符串的状态。循环内部会直接对长度为1的区间直接修改为状态为true。,首先枚举从0到n - 1 的长度的字符串。,利用了额外的dp数组,来存储对应的状态。内部:i,也就是起始位置从左到右即可。最外层:字符串的长度从短到长。为真的话就更新当前的。
2024-06-17 21:30:21
1254
原创 牛客热题:最长上升子序列(一)
对于所有的初始状态,都应该设置为1,因为对于以每一个位置结尾的最长上升子序列的长度最小为1。空间复杂度:O(N), 额外使用了一个和原数组长度相同的dp数组。, 双层循遍历数组的同时,遍历当前节点之前的所有节点。外层循环,从左到右,内部循环,均可。为结尾的最长上升子序列的长度。
2024-06-16 21:36:47
821
原创 牛客热题:兑换零钱(一)
使用递归方法和动态规划思想,通过dp数组记录中间结果,避免重复计算,提高效率。递归函数中每次选择一个硬币面值,尝试组合达到目标金额,找出最少的硬币数量。如果某个金额已经计算过,直接返回已存储的结果,避免重复计算,提高效率。
2024-06-15 18:08:01
1118
原创 牛客热题:把数字翻译成字符串
step1:先将原矩阵沿着对角线进行交换元素(注意这里第二个内部循环的上界是i,如果为n的话,相当于交换过来的元素,又交换过去了,相当于没交换)step3:遍历数组的同时,将原数组中的元素,转换坐标后放入到旋转之后的数组内部。空间复杂度:O(1), 没有借助额外的空间实现了旋转矩阵。spep2:将每一行的在本行内进行旋转就可以得到结果了。,利用了额外的数组空间来存储答案。,相当于遍历整个矩阵的时间复杂度。step1:创建额外的数组空间。step2:遍历原数组。
2024-06-12 18:27:05
823
原创 牛客热题:旋转矩阵
step1:先将原矩阵沿着对角线进行交换元素(注意这里第二个内部循环的上界是i,如果为n的话,相当于交换过来的元素,又交换过去了,相当于没交换)step3:遍历数组的同时,将原数组中的元素,转换坐标后放入到旋转之后的数组内部。空间复杂度:O(1), 没有借助额外的空间实现了旋转矩阵。spep2:将每一行的在本行内进行旋转就可以得到结果了。,利用了额外的数组空间来存储答案。,相当于遍历整个矩阵的时间复杂度。step1:创建额外的数组空间。step2:遍历原数组。
2024-06-12 14:11:24
318
原创 牛客热题:旋转数组
我们先实现移动一次的方式,然后调用m次的这样的方式即可。空间复杂度:O(1), 只用了一个额外的temp变量。step1:先将对应的m进行取模,因为m可能会大于n。利用了三次旋转,每次旋转的时间复杂度是O(N)空间复杂度:O(1), 没有使用额外的变量。step4:将后n - m个进行反转。step2:将整个数组进行反转。step3:将前m个进行反转。
2024-06-12 13:11:07
840
原创 牛客热题:设计LRU缓存结构
step5: 如果溢出就删除对应的链表尾部的节点,然后将哈希中的映射删除掉,并释放掉对应的节点。 step3:如果没有set过就构建一个新的节点在哈希中创建映射,然后将新的节点插入到链表的头部。 step2:如果set过就将对应的节点移动到链表头,并且在哈希中改变其val的值。 step2:如果出现过,将其在链表中的节点移动到链表头的位置,并返回对应的val。空间复杂度:O(N), 利用到了长度等于size+2的链表长度和对应的map。 step1:查看对应的key是否已经被set过。
2024-06-11 23:21:50
824
原创 牛客热题:矩阵的最小路径和
首先我们发现遍历dp数组的时候,只会利用到dp数组的左上位置的信息。所以我们可以将dp数组缩减为一维数组的形式,重复利用这部分空间。其中的数据并不是我们想要的。所以我们进行了反向填写的操作。, 我们优化了空间,使用了长度等于第二个字符串的dp数组。的做法之前的j的正向遍历悠久导致。的时间复杂度应该是O(N);的时间复杂度应该是O(N);相当于遍历了一遍二维数组。使用了一个二维的dp数组。相当于遍历了一遍二维数组。
2024-06-10 13:52:34
1258
1
原创 牛客热题:不同的路径数目(一)
首先我们发现遍历dp数组的时候,只会利用到dp数组的左上位置的信息。所以我们可以将dp数组缩减为一维数组的形式,重复利用这部分空间。其中的数据并不是我们想要的。所以我们进行了反向填写的操作。, 我们优化了空间,使用了长度等于第二个字符串的dp数组。的做法之前的j的正向遍历悠久导致。的时间复杂度应该是O(N);的时间复杂度应该是O(N);相当于遍历了一遍二维数组。使用了一个二维的dp数组。相当于遍历了一遍二维数组。
2024-06-10 13:32:56
695
原创 牛客热题:最长公共子串
首先我们发现遍历dp数组的时候,只会利用到dp数组的左上位置的信息。所以我们可以将dp数组缩减为一维数组的形式,重复利用这部分空间。其中的数据并不是我们想要的。所以我们进行了反向填写的操作。, 我们优化了空间,使用了长度等于第二个字符串的dp数组。的做法之前的j的正向遍历悠久导致。的时间复杂度应该是O(N);的时间复杂度应该是O(N);相当于遍历了一遍二维数组。使用了一个二维的dp数组。相当于遍历了一遍二维数组。
2024-06-09 16:31:07
1106
原创 牛客热题:矩阵最长递增路径
dfs的时间复杂度为O(m * n), 主函数调用了m * n次,所以总体的时间复杂度是O( 对于每个(x, y)来说,遍历它上下左右四个坐标,查看是否越界或者满足递增的要求;创建了一个和原矩阵空间大小相同的矩阵用于判断当前的左边是否被递归过,以及一些变量。创建了一个和原矩阵同等空间的dp数组,则空间复杂度为O(n * m) 所以总体上来说空间复杂度:O(n * m); 相当于遍历一遍对应的矩阵O(n * m) 若是满足要求就继续递归满足要求的点。: 两重循环遍历矩阵中所有的点。
2024-06-05 14:26:00
1142
原创 牛客热题:缺失的第一个正整数
这段代码是用来找出一个数组中只出现一次的两个数字的。它的思路是利用异或操作找出数组中所有数字的异或结果,异或结果中为1的最低位,根据这个最低位将数组分为两组,分别进行异或操作,得到的结果就是这两个只出现一次的数字。除了存放结果的数组res外,只使用了几个常量级别的变量,所以空间复杂度为O(1)。step2:遍历哈希表,然后将其中只出现一次的插入到答案数组中即可。空间复杂度:O(N) , 利用了额外的空间,哈希表。时间复杂度:O(N) , 相当于遍历了两次数组。
2024-06-02 19:59:06
886
原创 牛客热题:数组中出现一次的两个数字
这段代码是用来找出一个数组中只出现一次的两个数字的。它的思路是利用异或操作找出数组中所有数字的异或结果,异或结果中为1的最低位,根据这个最低位将数组分为两组,分别进行异或操作,得到的结果就是这两个只出现一次的数字。除了存放结果的数组res外,只使用了几个常量级别的变量,所以空间复杂度为O(1)。step2:遍历哈希表,然后将其中只出现一次的插入到答案数组中即可。空间复杂度:O(N) , 利用了额外的空间,哈希表。时间复杂度:O(N) , 相当于遍历了两次数组。
2024-06-02 18:05:03
439
原创 PHP&Mysql用户邮箱注册实例
我们来创建一个简单的Web应用程序,使用HTML作为前端,MySQL作为后端数据库。我们将创建一个用于用户注册的应用程序,其中用户可以输入他们的名字和电子邮件,然后将这些信息存储在MySQL数据库中。
2024-05-30 22:03:21
967
原创 牛客热题:数据流中的中位数
,因为每次插入都需要在前面的元素中遍历找到对应的位置,所以每个元素的插入的时间复杂度是O(N),因此时间复杂度为O(中位数是指:有序数组中中间的那个数。, 说明,中位数是左边数据结构的最大值与右边数据结构的最小值的平均值。median-1]的数据,并且可以。返回最大值的,其实就是大根堆。然后,我们把[median]即中位数,随便放到哪个都可以。, 说明,中位数是左边数据结构的最大值。, 说明,中位数是右边数据结构的最小值。相对应的,如果我有个数据结构可以保留。返回最小值的,其实就是小根堆,
2024-05-29 20:36:25
906
原创 牛客热题:最小的k个数
step2:堆顶的元素大于当前遍历的元素,那么就将堆顶pop,然后将当前元素入堆。), 插入容量为k的大根堆时间复杂度为O(longk), 一共遍历n个元素。step1:堆中不够k个元素就向堆中插入数据。空间复杂度:O(K), 容量为K的优先队列。空间复杂度:O(N), 答案数组的长度。最后将堆中的元素全部放入到答案数组。) , sort的时间复杂度。堆顶的元素为堆中最大的元素。
2024-05-27 12:33:13
920
原创 牛客热题:寻找第K大
时间复杂度: O(nlognnlog nnlogn空间复杂度: O(nnn这是因为sort函数在最坏情况下需要线性的额外空间,同时进行排序的平均时间复杂度为 O(nlognn log nnlogn。
2024-05-27 12:31:57
867
原创 牛客热题:滑动窗口的最大值
空间复杂度:O(N),其中开辟了N - size大小的答案数组,和最大为size长度的双端队列。空间复杂度:O(N), 使用了一个N - size长度的数组用来返回答案。时间复杂度:O(N * M) ,其中N是数组的长度,M为size的大小。时间复杂度:O(N), 遍历了一遍数组,求出了所有滑动窗口的最大值。
2024-05-26 15:22:37
478
原创 牛客热题:有效括号
时间复杂度:O(1), 所有的请求均以O(1)的方式实现。 判断当前的值和s2的栈顶的数据比较,维护一个单调栈,用于实现常数级的min查询。空间复杂度:O(N), 使用了两个栈空间。 如果该值小就将其同时入栈给两个栈。,而第二个栈将自己的栈顶数据重入一遍。 否则,只入栈给第一个栈。 两个栈同时出栈即可。思路来自牛客大佬题解。
2024-05-26 14:07:23
196
原创 牛客热题:包含min函数的栈
时间复杂度:O(1), 所有的请求均以O(1)的方式实现。 判断当前的值和s2的栈顶的数据比较,维护一个单调栈,用于实现常数级的min查询。空间复杂度:O(N), 使用了两个栈空间。 如果该值小就将其同时入栈给两个栈。,而第二个栈将自己的栈顶数据重入一遍。 否则,只入栈给第一个栈。 两个栈同时出栈即可。思路来自牛客大佬题解。
2024-05-20 13:53:18
750
原创 牛客热题:用两个栈实现队列
时间复杂度:O(N) , 每次push的时间复杂度是O(1), 但是pop的时候,因为存在需要将其中的栈的数据搬运到另一个栈所以需要O(N)的复杂度,其中N是对应的搬运的数据的个数。空间复杂度:O(1), 除了题目给出的栈以外,只使用了常数个额外的变量空间。
2024-05-20 13:16:49
306
原创 牛客热题:二叉搜索树的最近公共祖先
空间复杂度:主要取决于递归调用的深度,即函数调用栈的使用情况。在最坏情况下,如果二叉搜索树是一个不平衡的树,递归调用可能达到树的高度。因此,空间复杂度为 O(h),其中 h 是树的高度。时间复杂度:这段代码的时间复杂度取决于树的高度,即 O(h),其中 h 是树的高度。
2024-05-19 13:51:03
361
原创 牛客热题:在二叉树中找到两个最近公共祖先
这段代码主要是用来判断一棵二叉树是否是平衡二叉树的。空间复杂度: O(n),因为需要递归调用的栈空间。时间复杂度:O(n)
2024-05-19 13:50:14
402
原创 牛客热题:判断是否是平衡二叉树
这段代码主要是用来判断一棵二叉树是否是平衡二叉树的。空间复杂度: O(n),因为需要递归调用的栈空间。时间复杂度:O(n)
2024-05-18 12:16:49
692
原创 牛客热题:判断二叉树是不是搜索二叉树
空间复杂度:O(M),申请了一个队列空间,该队列的最大空间为二叉树的最后一层的节点数。时间复杂度:O(N), 遍历了一遍二叉树。
2024-05-17 12:03:01
497
原创 牛客热题:判断是否是完全二叉树
空间复杂度:O(M),申请了一个队列空间,该队列的最大空间为二叉树的最后一层的节点数。时间复杂度:O(N), 遍历了一遍二叉树。
2024-05-17 12:01:53
420
1
原创 牛客热题:镜像二叉树
空间复杂度:O(N),没有额外开变量,但是递归调用的函数栈帧的个数和二叉树的节点数相同。时间复杂度:O(N) , 遍历一遍二叉树。
2024-05-16 13:22:50
432
原创 牛客热题:二叉树与双向链表
空间复杂度:O(N)。没有申请新的空间,但是递归调用栈占用了N的空间。时间复杂度:O(N),等于中序遍历的时间复杂度。
2024-05-15 12:15:32
783
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人