随笔分类 - 数据结构与算法
摘要:解题思路 总算理解KMP算法 前缀表求得是最大的公共前后缀长度 最长size-1, e.g siis 不是求回文串 所以不能动态规划 siis ==> [0,0 ,1 ] sii vs iis , 前缀是指string[0:size-1] 后缀是指string[1:size] 无论是求前缀表还是比较
阅读全文
摘要:记忆化递归 class Solution { public: //记忆化递归 std::unordered_map<TreeNode* , int> tmap; int rob(TreeNode* root) { // 对于当前节点 // 如果去偷 能获取到的最大利润 root->val + rob
阅读全文
摘要:思路 目标是让石头分割成尽量相等的两堆 等和数组 背包容量是sum/2 , 问题是选哪些元素可以使得背包最满 设dp[i][j] 表示背包容量是j , 前面[..i]物品能装的最大体积 dp[i][j] = dp[i-1][j] when 不放第i件物品 dp[i][j] = dp[i][j-num
阅读全文
摘要:什么是图的最小生成树(min span tree ,MST) 对于有N个节点的图,边数最多 有 N*(N-1)/2 , 如果只是希望所有节点都连通, N-1条边就够了 所谓最小生成树指的是在所有N-1条边的连通图中,边的权值和最小的就是最小生成图 Kruskal 寻找最小生成图 所有边进行排序 ,得
阅读全文
摘要:解题思路 并查集 ,重点在理解每个节点都要记录它的父亲节点 为节省查找时间,需要对路径进行压缩 如果当前节点能都与其他树合并 ,则应该讲集合总数减1 代码 class Solution { public: //利用并查集,字典: std::unordered_map , 倒树 //find merg
阅读全文
摘要:解题思路 numCourses 相当于节点的数目 prerequisites 描述了所有的有向边 如果有向图中存在环,根据每次只Push入度为0 的节点的规则,是不可能遍历所有节点的 环的意思就是存在相互依赖关系 精简的代码 class Solution { public: bool canFini
阅读全文
摘要:解题思路 关于图的深度优先遍历和广度优先遍历 为了标识出已经访问的路径,需要用到 hash 在DFS中需要记住如果能够访问 cnt=1 代码 class Solution { public: bool isRed(int x,int y,int k ) { // std::cout << x/10
阅读全文
摘要:解题思路 注意 原来题目中 TreeNode* buildTree(vector & preorder, vector & inorder) 改写成 TreeNode* buildTree(vector preorder, vector inorder) 前序遍历 ,关键找到在inorder中 pr
阅读全文
摘要:解题思路 本题相比 "剪绳子 I" , n能取得值更大了 如果用Python 得数值类型默认是支持大数的 , 类似3^200 这个数可以表示出来 但是C++中即便是long long (__int64) 都无法表示如此大的数 考虑使用贪心算法,依据就是尽最大努力保证长度3的子段最多 ,进而推出全局最
阅读全文
摘要:解题思路 使用有限状态机 关键在于理清状态个数,尤其是检查DOt是否在数字前出现 因为出现Dot后不能在有第二个Dot C++ std::unordered_map 初始化 C++ 去除std::string 首尾空格 s.erase s.find_first_not_of() 代码 class S
阅读全文
摘要:解题思路 四条边应该都利用左闭右开区间 要注意每次旋转的起始位置 和 矩阵长宽 最后应该是剩下一个横条 或竖条 ,这点可以模拟几次 再得出结论 代码 class Solution { public: vector<int> spiralOrder(vector<vector<int>>& matri
阅读全文
摘要:解题思路 stack法,很多跟链表相关的问题都可以用栈 快慢指针法, 找到一个 【pos ,pos+k】 的窗口 ,当滑到尾部时候 ,窗口头部位置就是倒数第K个节点 可以在脑海中找下具体例子 如 [4,5,NULL] 对应 “1->2->3->4->5, 和 k = 2” ,最后slow fast
阅读全文
摘要:解题思路 找到子问题 if p[i]= s[j] or p[i] ='.' : match(s[0..j-1],p[0..i-1]) else return false if p[i] = '' : match(s[0..j] ,p[0..i-1]) // is empty or p[i-1]p[i
阅读全文
摘要:方法1 回环法 讲listA & listB看成一个环 class Solution { public: ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) { //回环法 讲listA & listB看成一个环 //e.g
阅读全文
摘要:题目描述 思路1 使用长度为K的最大堆 举例说明 [4 5 1 6_max] push(2) [2,4, 5 1 6_max] pop(6_max) get [2,1,4,5] C++ 代码 也可以使用make_heap 算法 class Solution { public: vector<int>
阅读全文
摘要:原题链接 leetcode : https://leetcode-cn.com/problems/longest-substring-of-all-vowels-in-order/ 解题思路 方法1 根据题目的英文提示 暴力法 Start from each 'a' and find the lon
阅读全文
摘要:题目描述 在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为“根”。 除了“根”之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果两个直接相连的房子在同一天晚上被打劫,
阅读全文

浙公网安备 33010602011771号