文章分类 - 数据结构
米奇妙妙屋,领略数据结构的奇妙
摘要:原题在这里: 概述题意,给定一个二叉树,要求转换为右子节点连接起来的单链表。 analyse: 没啥好说的,很普通的转换,写了递归和迭代两个版本。 code: class Solution { TreeNode *dfs(TreeNode *n) { if (!n) return nullptr;
阅读全文
摘要:原题在这里: 概述题意,给定二叉树和一个targetsum值,问在二叉树中连续(父子节点)片段,其和为targetsum的数量。 节点定义: struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode() : val(0)
阅读全文
摘要:原题在这里: 概述题意,给定一个数组x,返回一个数组y,y内每一个元素i值表示x从i开始左往右小于x[i]的递增元素数量。 (经典题目表示没能做出来有点菜) analyse: 1.很自然地想到用单调栈来解题,但是思路不太对,从左往右构造单增栈: 对于每一个height: 如果当前stack.top更
阅读全文
摘要:原题在这里: 概述题意,要求比O(n)复杂度更好的求出完全二叉树的节点数量的算法。 struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode() : val(0), left(nullptr), right(nullpt
阅读全文
摘要:原题在这里: 概述题意,给定一个m*n的乘法表,问第k小的数字。 analyse: 我就只能想到这个乘法表是主对角线对称,然后就没有然后了,发呆ing。 标准解法: 找第k小的数字->二分查找数字x,利用k对于小于x数的数字进行二分。 每一行i,有min(x/i,n)个小于x的数字,遍历即可 优化,
阅读全文
摘要:原题在这里: 概述题意,给定一个无序可重复元素数组,问数组中构成的最长连续数值长度。 要求O(n)时间复杂度。 analyse: 1.初始想法,set+mp遍历,时间复杂度还行。 code: class Solution { public: int longestConsecutive(vector
阅读全文
摘要:原题在这里: 概述题意:要求在常数额外空间条件下处理数组元素保证重复次数不超过2次,修改数组并返回数组长度。 analyse: 属于是经典题目了,双指针,左指针为实际数组下标,右指针移动进行判定。 初始code: class Solution { public: int removeDuplicat
阅读全文
摘要:原题在这里: 题意:实现满足O(1)时间复杂度的get和put操作的LRU算法。 analyse: 1.第一次做的时候,选用了图论中链式前向星+set哈希处理的解法 思路:翻译为图,也就是找num时间戳在capacity范围内的边 对于每一个key,就当作一个节点,每指向一个value就是一条边 g
阅读全文
摘要:原题在这里: 概述题意,要求将给定二叉树根节点转化为字符串,根据自己字符串结构转换还原二叉树。 这里二叉树为搜索二叉树。 analyse: 普通前序遍历转换为string,普通前序构造node。 虽然思路很简单,也是前面做过类似的题,但是这次解法优于上次不少。 这里的代码也能ac上次的题。 stru
阅读全文
摘要:原题在这里: 概述题意,给定二叉树中,问最长的路径,可以不经过根节点。 analyse: 递归法,考虑是否经过当前节点分两种情况: 连接当前节点:x=max(根,max(根+左,根+右)) 不连接当前节点:全局ans考虑一次max(ans,max(x,max(根+左+右,max(左,右)) 注意此时
阅读全文
摘要:原题在这里: 概述题意:在给定数组中,满足所有元素只出现一次或两次,找出所有出现两次的元素。 analyse: 1.我原本思考点是考虑异或运算,利用偶数次异或运算结果为0来处理数据,但是并不能实现,所有元素的异或结果无法利用。 2.标准解法为,标记法,将x=num[i]所指向下标为x-1元素赋值为负
阅读全文
摘要:原题在这里: 概述题意,问给定字符串s中有多少个子串是回文串,不同下标构成的子串视为不同子串。 analyse: 1.暴力,数据范围只有1e3,substr+reverse暴力判断 code: class Solution { bool check(string s) { string x = s;
阅读全文
摘要:随便刷几个天梯赛题目。 原题在这里 概述题意,给定完全二叉树的后序遍历,问层序遍历结果。 analyse: 1.刚开始很认真的逆序建树,写得不是很顺畅,因为我不喜欢这种数据关系类型的题目。 code: #include <bits/stdc++.h> using namespace std; #de
阅读全文
摘要:原题在这里: 概述题意,相比于I,这里多了要求出输出所有最短路径。 analyse: 1.在队列元素里增添一个vector<string>属性即可 code: class Solution { struct iis { int x; int y; vector<string> s; friend b
阅读全文
摘要:原题在这里: 概述题意,问一个字符串是否由其子串重叠n次构成(n>=2)。 analyse: 我直接就是kmp解法,利用了next数组的性质之一: next[i],表示在i位置匹配的最长前缀 i-next[i],表示失配时候,下一次匹配的右移距离 对于next[i],有next[i]&&i%(i-n
阅读全文
摘要:原题在这里: 概述:给定两个字符串s,t,问在s中能构成t串的数量(不同下标则不同构造)。 analyse: 记忆化搜索+剪枝: 定义s,t串长度为n,m 定义dfs(u,v):表示在s[i,n)内查找t[v]字符 剪枝:因为需要保证s串剩余字符长度满足后续t串的匹配,就一个遍历优化: 在s[u,n
阅读全文
摘要:原题在这里: 概述题意:给定节点数和无向图边,问能构成最小高度树的所有根节点。 analyse: 1.最直白的方式就是bfs遍历找当前节点的最长的最短路。ans选为该(最长的最短路)最短节点集合。 但是数据范围不适合,考虑优化,我想当然式的以为从边数最多节点开始遍历直到深度变大(以为从边数最多开始一
阅读全文
摘要:原题在这里: 概述: 给定一个二叉树的根节点,要求转换为任意字符串,后将该字符串还原二叉树的结构。 硬核手撸: struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NUL
阅读全文
摘要:原题在这里: 概述题意:给定数组中,求不相邻最大取值和(首尾也相邻) 我动态规划真的不太行 写了个dfs,TLE class Solution { vector<int> num, vis; int n, ans; void dfs(int x, int y) //下标为x { if (vis[(x
阅读全文
摘要:原题在这里: 给两个数组表示前序和中序遍历结果,按此构造二叉树并返回根节点。 analyse: 前序定根,中序分左右,铁板版的我写错了数组名字,瞎搞半小时浪费时间 code: class Solution { vector<int> pre, mid; int x; int find(int l,
阅读全文