
数据结构和算法
数据结构和算法
自由技艺
资深AI算法和C++软件工程师,专注于下一代分布式AI系统,曾就职于华为、百度,北邮土著博士
请关注知乎同名账号
展开
-
leetcode71简化路径 - 状态机
#include "string.h"#include "stdio.h"typedef enum { STATE_INIT, // 刚刚处理完成 STATE_ONE_POINT, // 只读到了1个'.' STATE_TWO_POINT, // 只读到了2个'.' STATE_PATH, // 读到一个正常路径} State;Sta...原创 2020-04-03 11:02:09 · 186 阅读 · 0 评论 -
leetcode刷题总结 -- 图
421数组中两个数的最大异或值先建字典树,再挨个遍历num,按分支走到叶子,记录最大的ans332重新安排行程欧拉路径–1笔画问题两个关键点:1、给每个string编号,从0开始;2、从当前节点curr遍历,直到“无路可走”时,把curr加入ans。所经历的边一直处于pop状态662二叉树最大宽度二叉树的一个重要性质 node孩子编号与其自身编号关系, double处理溢出,list...原创 2020-03-07 18:35:42 · 317 阅读 · 0 评论 -
leetcode刷题总结 -- 动态规划
152乘积最大的连续子序列圈复杂度很高,不要遗漏分支vector<int> mx(len, 0);vector<int> mn(len, 0);213打家劫舍 II – 如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。vector<int> s(len, 0);vector<int> n(len, 0);...原创 2020-03-07 18:32:02 · 162 阅读 · 0 评论 -
leetcode刷题总结 -- 技巧
959由斜杠划分区域初始化 编号 把每个grid分割 有2种分法60第k个排列std::next_permutation(it1, it2, f);或者纯数学方法1297子串的最大出现次数 – 子串中不同字母的数目必须小于等于 maxLetters + 子串的长度必须大于等于 minSize 且小于等于 maxSize 。注意是子串,不是子序列!可以断定,在所有满足条件且出现次数最...原创 2020-03-07 18:31:17 · 293 阅读 · 0 评论 -
leetcode刷题总结 -- O(n)问题
945使数组唯一的最小增量 [1 2 2] -> [1 2 3]排序 + 贪心策略最佳观光组合max(A[i] + A[j] + i - j), i < jdp[j] – 固定j时的得分;遍历j,记录[0, j - 1]中A[i] + i的最大值;爱生气的书店老板 – 窗口X内生气顾客总数, 找到生气顾客最多的窗口位置初始化[0, X -1]区间内生气客户数;滑动窗–用...原创 2020-03-06 20:35:03 · 2180 阅读 · 0 评论 -
leetcode刷题总结 -- 目录
前言提示语:编译出错、解答错误、执行出错、超出时间限制、超出内存限制、通过解释:“解答错误”:用例没完全通过“执行出错”:可能部分用例通过,但出现了某个用例使得程序运行异常,一般由于内存错误或者整数溢出,但不限于此。“通过”:65 (40 + 40 + 60)符合安全编码规范及通用编码规范如何拓展思路?深度理解leetcode平台上“标签分类”列表中所有名词,牢记于心。深入掌握C...原创 2020-03-06 16:05:12 · 420 阅读 · 0 评论 -
【2020/02/19】leetcode问题总结
dfs遇到不满足条件的节点,需要回退到之前某个点,怎么办?全部由0-9组成的string,如何比较整数大小及判断是否溢出?long圈复杂度稍微大点的代码如何简化,以减小出错概率?...原创 2020-02-19 16:08:02 · 196 阅读 · 0 评论 -
leetcode787 K站中转内最便宜的航班
方案一: Bellman-Ford DP源节点src, 目的节点v经过中间站个数为kdp[k][v]表示最多经过k个中间站到达v所需要的最少花费, 那么dp[k][v] = min{dp[k - 1][v], dp[k - 1][u[ + w[u][v]},u属于[0, n - 1]方案二: 新定义节点结构体,结构体中字段有节点编号、节点所处深度、及到达该节点的花费bfs在存在环的...原创 2020-01-22 16:00:27 · 421 阅读 · 0 评论 -
leetcode526“优美的排列”-经典回溯问题总结
题目描述:假设有从 1 到 N 的 N 个整数,如果从这 N 个数字中成功构造出一个数组,使得数组的第 i 位 (1 <= i <= N) 满足如下两个条件中的一个,我们就称这个数组为一个优美的排列。条件:第 i 位的数字能被 i 整除i 能被第 i 位上的数字整除现在给定一个整数 N,请问可以构造多少个优美的排列?1、不定义新的节点结构体只用一个stack<int&...原创 2020-01-22 11:56:46 · 266 阅读 · 0 评论 -
leetcode907 所有连续子数组中最小值之和
ex. A = [3 1 2 6 4]对于原始数组A中下标为k的元素,从k往左寻找,至第一个小于A[k]的元素出现,下标记为i:如果下标i不存在,那么sum[k] = A[k] * (k + 1);如果下标i存在,那么sum[k] = sum[i] + (k - i) * A[k];其中,sum[k]表示所有以A[k]结尾的连续子数组最小值和。那么,问题来了: 对于任意的k,如何快速找到...原创 2020-01-20 14:50:19 · 515 阅读 · 0 评论 -
leetcode97 子数组最小值之和
/*class Solution{ public: using myType = pair<int, int>; struct cmp { bool operator()(const myType& m1, const myType& m2) const { return m1.second > m2.second; } ...原创 2020-01-15 18:09:29 · 129 阅读 · 0 评论 -
leetcode983"最低票价问题"解法分析
力友解法一:整体往后移动30天,避免天数判断,简化代码class Solution {public: int mincostTickets(vector<int>& days, vector<int>& costs) { int dp[400] = {}; int a = costs[0], b = costs[1...原创 2020-01-15 09:28:31 · 291 阅读 · 0 评论 -
leetcode131 dp+回溯+vector代替stack
题目:给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。返回 s 所有可能的分割方案。class Solution {public: vector<vector<string>> partition(string s) { vector< vector<int> > dp = isPalindr...原创 2020-01-14 11:08:30 · 184 阅读 · 0 评论 -
逆序删除list元素 反向迭代器
rt原创 2020-01-07 16:52:21 · 479 阅读 · 1 评论 -
红黑树
平衡树是为了解决二叉查找树退化为链表的情况,而红黑树是为了解决平衡树在插入、删除等操作需要频繁调整的情况原创 2021-04-08 16:31:07 · 80 阅读 · 0 评论 -
AC 自动机
https://www.cnblogs.com/nullzx/p/7499397.html原创 2021-04-07 15:20:31 · 93 阅读 · 0 评论 -
ukkonen 后缀树算法
https://www.cnblogs.com/gaochundong/p/suffix_tree.html原创 2021-04-07 14:37:01 · 128 阅读 · 0 评论 -
快速排序
#include <iostream>#include <vector>#include <ostream>#include <stack>std::ostream& operator<<(std::ostream& stream, const std::vector<int>& v){ for (auto i : v) { stream << i <<原创 2021-03-23 23:33:59 · 102 阅读 · 0 评论 -
x & (- x) 与 x & (x - 1)
x & (x - 1) 表示:消除x从右到左遇到的第一个1x & (- x)表示:x从右往左第一个1的位置为k,2^k原创 2020-03-12 18:53:56 · 165 阅读 · 0 评论 -
高级数据结构之leetcode315 -- 计算右侧小于当前元素的个数(拓展)
https://blog.youkuaiyun.com/haolexiao/article/details/54989306该题拓展为“计算右侧小于当前元素的所有元素和”“逆序对”二叉搜索树(BST)树状数组线段树归并排序变体...原创 2020-03-12 09:53:02 · 143 阅读 · 0 评论 -
十大排序算法
选择、冒泡(*)选择:依次找出最大值放在数组开始位置冒泡:遍历,比较相邻元素,最大值移到数组末尾插入(*)、希尔插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率。但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位。希尔排序是插入排序的一种,又称“缩小增量排序”归并(*)、快速堆计数(*)、桶(*)、基数(*)...原创 2020-03-10 10:41:50 · 124 阅读 · 0 评论 -
二叉树前序、中序、后序遍历相互求法
前序遍历: 1.访问根节点 2.前序遍历左子树 3.前序遍历右子树中序遍历: 1.中序遍历左子树 2.访问根节点 3.中序遍历右子树后序遍历: 1.后序遍历左子树 2.后序遍历右子树 3.访问根节点 一、已知前序、中序遍历,求后序遍历例:前序遍历: GDAFEMHZ中序遍历: ADEFGHMZ画树求法:第一步,根据前序遍历的特点...转载 2020-03-03 19:51:01 · 158 阅读 · 0 评论 -
欧拉路径
连通无向图存在欧拉路径《=》G中奇定点(连接的边数量为奇数的定点)的数目等于0或者2;连通无向图G存在欧拉回路《=》G中每个定点的度都是偶数;连通有向图存在欧拉路径(定点u->顶点v)《=》u的出度比入度多1,v的出度比入度少1,而其他顶点的出度和入度都相等...原创 2020-02-21 10:16:13 · 136 阅读 · 0 评论 -
二叉树终结篇
原创 2020-02-18 17:30:19 · 137 阅读 · 2 评论 -
Bellman-Ford算法
问题: 假设一张图中总共有n个节点,编号0 ~ n - 1, 计算K节点到所有其他节点的最短距离初始化: vector<int> dist(n, INT_MAX)边:vector<\vector<int>> edges;邻接表:vector<\vector<int>> adj;for (int i = 0; i < n; i...原创 2020-01-22 16:29:33 · 133 阅读 · 0 评论 -
Kruskal算法和Prim算法
K算法: 加边法(边权值按从小到大排序)P算法: 加点法原创 2020-01-17 00:19:54 · 152 阅读 · 0 评论 -
Dijkstra算法和Floyd算法
D算法可分为4个步骤:1、初始化节点;2、寻找dist[i]中最小值对应的节点minIdx;3、更新所有与节点minIdx相邻的节点经过它中转时的路径信息;4、更新已访问过的所有节点经过minIdx中转时的路径信息;...原创 2020-01-16 17:49:38 · 194 阅读 · 0 评论