- 博客(17)
- 收藏
- 关注
原创 【环检测与拓扑排序(java)】
为什么环检测和拓扑排序放在一起,因为在拓扑排序之前要检查一下图中是否有环,拓扑排序的前提是不能有环。环检测与拓扑排序都有两种方法:BFS和DFS。针对的是:有向图。
2024-11-04 21:27:04 380
原创 【BFS】
问题的本质就是让你在一幅「图」中找到从起点 start 到终点 target 的最近距离。bfs是从树的层序遍历中衍生出来的。BFS 相对 DFS 的最主要的区别是:dfs得将树遍历完才直到起点到终点的最小距离,而bfs不一定遍历完所有节点。所以bfs比dfs快一点,但是bfs的空间复杂度会更大。dfs是递归,得压栈,空间复杂度就是树的高度,而bfs用的队列,队列要装得下最后一层的节点,如果看成满二叉树,最后一层的节点数占总节点数的1/2,空间就更大一些。
2024-11-03 21:16:47 385
原创 【回溯方法(解决子集、组合、排列问题)】
回溯算法就是纯暴力算法,有些问题纯暴力写不出来就得用回溯方法,比如:要你在100个数中,挑50个数,如果用暴力写得用50层for循环,显然是不现实的,所以引进了回溯方法,暴力解法中的嵌套的for相当于回溯方法中的递归,可以理解为进入下一层决策树,在进入下一层决策树之前要做出选择,之后要撤销选择。抽象地说,解决一个回溯问题,实际上就是遍历一棵决策树的过程,树的每个叶子节点存放着一个合法答案。你把整棵树遍历一遍,把叶子节点上的答案都收集起来,就能得到所有的合法答案。
2024-11-03 14:44:33 877
原创 【最长回文子串(双指针解决)java】
1.遍历原字符串,分别以下标为i为中心,i与i+1为中心来计算最长回文子串。2.怎么找最长回文子串(fun函数中实现):用双指针来向两边扩散。,有两种情况:a.中间是偶数、b.中间是奇数。
2024-10-24 20:39:42 412
原创 dfs题目:平衡二叉树(java)
}* }*///功能:求以root为根的深度return 0;//以root为根的深度=1+以root下一层的深度(较大的子树)//先求一下root左子树的深度//比较一下,选大的if(l>r){return 1+l;//函数功能:判断以root为根,判断他的左右子树是否平衡//先求root的左子树的深度//再求root的右子树的深度//比较一下是否左右子树的深度差是否>1。
2024-10-21 20:58:05 405
原创 【粉刷房子(动态规划(简单多状态dp问题))】
回归转移方程:在dp[i][0]等于在i-1位置的最小花费+costs[i][0],i-1位置不能是红色的,最小花费是min(dp[i-1][1],dp[i-1][2]),dp[i][1]和dp[i][2]和dp[i][0]类似。根据经验,看最近的位置,dp[i]是i-1位置的最小话费+i位置的花费,问题来了,i位置的花费有三种,所以一维dp表不可以,得用二维dp表,有题目可知,顺序是从0号房间到i号房间,顺序是从左往右,所以还是根据经验+题目要求。根据转移方程,现有i-1位置再有i位置,所以是从左往右。
2024-10-03 20:35:02 480
原创 【删除并获得点数(动态规划--简单多状态dp问题)】
没听懂没关系,举个例子就容易理解了,假设原数组{1,2,2,4,4,4,7,7,8},建立arr[9]的临时数组,初始化arr数组为0,遍历完原数组后arr中的值为{0,1,4,0,12,0,0,14,8},其中arr[2]表示原数组中的2相加后为4。数组是无序的,删除元素不方便,所以先变得有序,怎么变得有序?创建新的数组arr,数组的大小是原数组中的最大数+1,原数组的元素对应arr下标,然后遍历原数组,在对应的位置加加,目的是统计下标值在原数组出现的总值。具体步骤在下面链接里,在这里不再赘述。
2024-10-02 18:56:11 570
原创 按摩师(动态规划--简单多状态问题)
这个题目的状态表示是,dp[i]表示:以i位置为终点,在i位置时的最大预约时长。这个题目还可以细分,假设在i位置,在i位置可以选也可以不选,我就用。经验就是,找离i位置最近的位置分析。在i位置有两种情况:选nums[i]和不选nums[i]。目的是:防止dp表越界,观察转移方程发现i最小只能为1,根据题目要求可以看出来,是从左往右进行的,所以就。根据转移方程不难发现是。
2024-10-02 14:07:17 560
原创 地下城游戏--动态规划.路径问题
根据经验:找里下标(i,j)最近的位置考虑,离下标(i,j)最近的是dp[i+1][j]和dp[i][j+1],设我要从(i,j)走到终点需要的健康点数为x,x+dungeon[i][j]就表示我走出(i,j)格子剩下的健康点数,它要满足大于等于min(dp[i+1][j],dp[i][j+1])才能到达终点。注意**:当算出来dp[i][j]<=0时,说明它获得的健康点数很大足已为负数了,但是如果是<=0,那么就不能继续往下走了,所以当<=0时,要变成1**。绿色格子里面填什么值?
2024-09-21 18:53:06 444
原创 题目:解码方法(来自leetcode)动态规划----斐波那契模型
就相当于把下标为i-1和i看成一个整体,放在dp[i-2]后,所以dp[i]=dp[i-2];初始化的目的是防止越界,所以要使合并时dp[i]=dp[i-2]不越界,至少i=2,所以初始化dp[0]和dp[1]。,就相当于在dp[i-1]种情况后接上一个单独解码,所以dp[i]=dp[i-1],第二种是:当s[i]=0时。合并解码也分两种情况:第一种:与前面的数合并后的数在[10,26]之间。单独解码有分两种情况:第一种是:当s[i]在[1,9]时。dp[i]表示为从下标i之前的的解码数。
2024-09-15 14:09:57 543
原创 【配对交换】(I & << >> 的应用)
1.要想奇数位和偶数位交换位置,首先要找到奇数位和偶数位。2.然后将奇数位整体向左移动一位,偶数位整体向右移动一位。3.交换位置后用或运算就合在一起。
2024-09-07 18:13:31 274
原创 【链式二叉树总结--简略版】C语言版
用队列来做,先Push值为1的节点进队列,然后这个节点Pop出去,再Push这个节点的左节点(值为2)和右节点(值为4)。再Pop出值为2的节点,Push进值为2的节点的左右子节点,以此类推。如果一个二叉树的层数为k,前面k-1层是满二叉树,最后一层(第k层)从左向右是连续的。要注意的是满二叉树是一种特殊的完全二叉树。用递归,找相同的问题:根的值是不是x,是就返回其地址,不是就找根的左节点和右节点。求第k层节点的个数=左子树的第k-1层节点的个数+右子树的第k-1层节点的个数。二叉树不存在度大于2的结点。
2024-08-14 17:07:00 940
原创 堆总结(C语言)
可以这样记:二叉树的最后一层大约占一半2^(h-1),倒数第二层的节点大约占1/4,向下调整建堆是节点数量多的层遍历的深度小,上面节点少的层遍历深度大;向上建堆是上面节点少的层遍历深度小,下面节点多的层遍历深度大。的,如果存普通的二叉树就会浪费空间。堆(一种二叉树)使用顺序结构的数组来存储。堆不是简单的存储数据,还有些功能,堆可以。TOP-K问题:在大量的数据中,求前 K 个最大元素或最小元素。2.剩下的N-K个元素依次与堆顶元素进行比较。堆总是一棵完全二叉树,堆是用来存。1.在数据的前k个元素来建堆。
2024-08-10 21:25:04 581
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人