![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
Judy是coding大王
这个作者很懒,什么都没留下…
展开
-
动态规划第二讲
这次是从表达式的角度对动态规划进行分类1.前缀和sum(i, j) = sums(0, j + 1) - sum(0, i)ans = max(ans,i-map[value-k]+1);2.区间动态规划for len = 1…nfor i = i…lenj = i + len - 1for k = i…jdp[i][j] = max(dp[i][j], f(dp[i][k], dp[k][j]))3.背包问题0-1 背包对物品的迭代放在外层,里层的体积或价值逆向遍历;完全背包对物品原创 2021-09-23 08:47:18 · 113 阅读 · 0 评论 -
二分/双指针/排序
二分模板1int left = 0, right = nums.size() - 1;while(left <= right)else if(nums[mid] < target) { left = mid + 1; }else { right = mid - 1; }模板2主要用于找到当前索引和右邻居int left = 0, right = nums.size();while(left < right){int mid = left + (right - left)原创 2021-09-21 18:00:54 · 123 阅读 · 0 评论 -
深度搜索/广度搜索
广度搜索采用队列的方式queue<pair<int, int>> p;while(!p.empty()){int n = p.size();while(n>=0){auto [x,y] = p.front();p.pop();…p.push()…;}}拓扑排序把拓扑转换成图的结构vector<vector> to(n);vector ingree(n,0);for(auto iter:relations){to[iter[0]原创 2021-09-21 17:14:58 · 139 阅读 · 0 评论 -
字符串/map/set的操作
截取其中一段字符串str.substr(i,j-i); //长度是j-iunordered_set s;s.insert(d);s.erase(d);s.count(d)s.find(d) ==s.end()unordered_map<int,int>根据value 寻找keyauto pos = hash.find(target - num);if (pos == hash.end()) {hash[num] = i;map.insert(make_pair(5,5))原创 2021-09-21 13:52:02 · 96 阅读 · 0 评论 -
LeetCode之动态规划
目前,我觉着刷题里面,最难的就是动态规划,结合leetcode101总结下.1.一维关联dp[i] = dp[i-1]+dp[i-2]2.二维关联dp[i][j] = min(dp[i-1][j-1], min(dp[i][j-1], dp[i-1][j])) + 1;3.分割类型割类型题,动态规划的状态转移方程通常并不依赖相邻的位置,而是依赖于满足分割条件的位置dp[i] = dp[i] || dp[i - len];4.子序列类型对于子序列问题,第一种动态规划方法是,定义一个 dp 数原创 2021-09-20 23:15:50 · 77 阅读 · 0 评论 -
深度搜索,广度搜索,回溯
深度搜索深度优先搜索(depth-first seach,DFS)在搜索到一个新的节点时,立即对该新节点进行遍历;因此遍历需要用先入后出的栈来实现,也可以通过与栈等价的递归来实现。有时我们可能会需要对已经搜索过的节点进行标记,以防止在遍历时重复搜索某个节点,这种做法叫做状态记录或记忆化(memoization)广度搜索广度优先搜索(breadth-first search,BFS)不同与深度优先搜索,它是一层层进行遍历的,因此需要用先入先出的队列而非先入后出的栈进行遍历。由于是按层次进行遍历,原创 2021-01-24 23:08:26 · 205 阅读 · 0 评论 -
动态规划
1.贪心、分治、回溯、动态规划,这四个算法思想有关的理论知识,大部分都是“后验性”的,也就是说,在解决问题的过程中,我们往往是先想到如何用某个算法思想解决问题,然后才用算法理论知识,去验证这个算法思想解决问题的正确性。2.现在,我们再来看,什么是“三个特征”?它们分别是最优子结构、无后效性和重复子问题。这三个概念比较抽象,我来逐一详细解释一下3.回溯算法相当于穷举搜索。穷举所有的情况,然后对比得到最优解。不过,回溯算法的时间复杂度非常高,是指数级别的,只能用来解决小规模数据的问题。对于大规模数据的问题,原创 2020-11-24 17:33:48 · 314 阅读 · 1 评论 -
二分法
1.循环的条件low<=high2.mid = low+(high-low)/2如果low和high比较大,会溢出3.low= mid+1,high = mid-1这样能够避免进入死循环二分查找的局限性1.操作数据结构需要是数组2.其次,二分查找针对的是有序数据优势:不管是散列表还是二叉树,都会需要比较多的额外的内存空间,采用数组的结构不需要额外的存储空间...原创 2020-11-12 21:02:51 · 67 阅读 · 0 评论 -
前序中序后序遍历
1 void preOrder(Node* root) {2 if (root == null) return;3 print root // 此处为伪代码,表示打印 root 节点4 preOrder(root->left);5 preOrder(root->right);6 }78 void inOrder(Node* root) {9if (root == null) return;10 inOrder(root->left);11 print root //原创 2020-11-12 20:19:32 · 54 阅读 · 0 评论 -
红黑树
平衡二叉树的严格定义是这样的:二叉树中任意一个节点的左右子树的高度相差不能大于根节点是黑色的;每个叶子节点都是黑色的空节点(NIL),也就是说,叶子节点不存储数据;任何相邻的节点都不能同时为红色,也就是说,红色节点是被黑色节点隔开的;每个节点,从该节点到达其可达叶子节点的所有路径,都包含相同数目的黑色节点;红黑树中包含最多黑色节点的路径不会超过 log 2 n,所以加入红色节点之后,最长路径不会超过 2log 2 n...原创 2020-11-12 20:26:22 · 63 阅读 · 0 评论 -
链表
if (head->next == null) {head = null;}if (head==null){head = newnode;}# 空链表插入哨兵结点是不存储数据的原创 2020-11-12 20:27:29 · 47 阅读 · 0 评论 -
递归常遇到的问题
在实际的软件开发中,编写递归代码时,我们会遇到很多问题,比如堆栈溢出。而堆栈溢出会造成系统性崩溃,后果会非常严重。为什么递归代码容易造成堆栈溢出呢?我们又该如何预防堆栈溢出呢?我在“栈”那一节讲过,函数调用会使用栈来保存临时变量。每调用一个函数,都会将临时变量封装为栈帧压入内存栈,等函数执行完成返回时,才出栈。系统栈或者虚拟机栈空间一般都不大。如果递归求解的数据规模很大,调用层次很深,一直压入栈,就会有堆栈溢出的风险。空间复杂度高、有堆栈溢出的风险、存在重复计算、过多的函数调用会耗时较多等问原创 2020-11-12 20:17:36 · 1295 阅读 · 0 评论