AI算法工程师
文章平均质量分 59
算法是解决问题的思路、步骤和具体方法
捡起一束光
某985本硕,热爱分享推荐系统、自然语言处理等优质内容的算法工程师
展开
-
OJ 刷题思路汇总
算法能力的提升是一个漫长的过程,在训练算法过程中要多思考,多总结,寻求正反馈,确保自己的刷题动力!原创 2020-05-28 12:54:23 · 1027 阅读 · 0 评论 -
LeetCode 题解 | 236. 二叉树的最近公共祖先(经典递归 C++)
题目描述(中等难度)原题链接算法(递归) O(n)O(n)O(n)当我们用递归去做这个题时不要被题目误导,应该要明确一点这个函数的功能有三个:给定两个节点p和q如果p和q都存在,则返回它们的公共祖先;如果只存在一个,则返回存在的一个;如果p和q都不存在,则返回NULL题目说给定的两个节点都存在,那自然还是能用上面的函数来解决具体思路:如果当前结点root等于NULL...原创 2020-02-12 17:19:08 · 483 阅读 · 1 评论 -
2021年力扣战队赛 困难题 LCP 35. 电动车游城市(拆点+spfa最短路)
困难题:LCP 35. 电动车游城市(2021年力扣战队赛题目)原题链接:https://leetcode-cn.com/problems/DFPeFJ/题目描述:小明的电动车电量充满时可行驶距离为 cnt,每行驶 1 单位距离消耗 1 单位电量,且花费 1 单位时间。小明想选择电动车作为代步工具。地图上共有 N 个景点,景点编号为 0 ~ N-1。他将地图信息以 [城市 A 编号,城市 B 编号,两城市间距离] 格式整理在在二维数组 paths,表示城市 A、B 间存在双向通路。初始状态,电动车电量为原创 2021-07-14 10:12:07 · 3235 阅读 · 0 评论 -
面试题 | 求两个字符串的最长公共子串 要求时间复杂度O(nm),空间复杂度O(1)
来源:牛客网-编程题题意:给定两个字符串str1和str2,输出两个字符串的最长公共子串,如果最长公共子串为空,输出-1。思路:用动态规划空间复杂度会是 O(nm)O(nm)O(nm),我们发现计算每一个 f[i][j]f[i][j]f[i][j] 的时候只需要计算f[i−1][j−1]f[i-1][j-1]f[i−1][j−1],所以只要按照斜线方向(遍历 n + m - 1条斜线)计算所有的值,用一个变量维护最大值,那么空间复杂度就可以降低到 O(1)O(1)O(1)核心:知道如何遍历 n +原创 2020-06-02 15:32:11 · 2074 阅读 · 0 评论 -
LeetCode 题解 | 56. 合并区间(模版题 C++)
来源:https://leetcode-cn.com/problems/merge-intervals/合并区间版子题 传送门class Solution {public: vector<vector<int>> merge(vector<vector<int>>& intervals) { // intervals = [[1,3],[2,6],[8,10],[15,18]] vector<vec原创 2022-05-19 12:45:48 · 42 阅读 · 0 评论 -
Kick Start 2019.NumberGuessing + eoj 3342. 经典的猜数字游戏 (二分 交互题 C++)
虽然范围是 $[l + 1, r]$,但用这范围如果出题人的数是最后一个,那最后一次会还没有猜就退出循环,所以保险点直接用 $while(true)$原创 2020-05-27 10:11:31 · 646 阅读 · 0 评论 -
LeetCode 题解 | 43. 字符串相乘(大数相乘 高精度 x 高精度 C++)
来源:https://leetcode-cn.com/problems/multiply-strings/class Solution {public: vector<int> mul(vector<int> &A, vector<int> &B) { vector<int> C(A.size() + B.size(), 0); for (int i = 0; i < A.size(); i+原创 2020-05-26 11:27:54 · 249 阅读 · 0 评论 -
EOJ 题解 | 1056.线性同余方程 (扩展欧几里得 C++)
原题链接解题思路扩展欧几里得算法求出一组特解,然后 0∼m−10\sim m-10∼m−1中共有 (a,m)(a,m)(a,m) 个解#include <iostream>using namespace std;int exgcd(int a, int b, int&x, int & y) { if (!b) { x = 1, y = 0; return a; } int d = exgcd(b, a % b原创 2020-05-21 09:46:44 · 304 阅读 · 0 评论 -
LeetCode 题解 | 204. 计数质数(线性筛素数 C++)
题目描述(简单难度)原题链接算法(线性筛素数) O(n)O(n)O(n)核心:每个数只会被最小的质因数筛掉时间复杂度是O(n)O(n)O(n)C++代码class Solution {public: static const int N = 1e7; int primes[N], cnt; int st[N]; void getPrimes(int n) { for (int i = 2; i < n; i ++) {原创 2020-05-17 20:02:02 · 311 阅读 · 0 评论 -
POJ 题解 | 3070.Fibonacci 求斐波那契数列的第 n 项(矩阵快速幂 C++)
题目描述原题链接算法(矩阵快速幂) O(logn)O(logn)O(logn)这是一个求递推公式的 n 项的问题,我们可以使用矩阵快速幂算法来加速递推过程时间复杂度是O(logn)O(logn)O(logn),空间复杂度是O(1)O(1)O(1)C++代码#include <iostream>using namespace std;const int N = 100, mod = 1e4;int n, k;struct mat { int m[N][N];原创 2020-05-16 13:05:30 · 452 阅读 · 0 评论 -
LeetCode 题解 | 410. 分割数组的最大值(最大值最小化 二分答案 C++)
题目描述(困难难度)原题链接算法(二分答案) O(nlogn)O(nlogn)O(nlogn)二分答案经典题所求的最大子数组和在 [max(nums), sum(nums)] 之内,但是我其实稍微扩大范围也能做,但要注意check函数里要多一句判断语句if (nums[i] > x) return false;C++代码1class Solution {public: ...原创 2020-05-08 10:52:29 · 482 阅读 · 0 评论 -
LeetCode 题解 | 459. 重复的子字符串(find函数、字符串哈希 C++)
题目描述(简单难度)原题链接算法原理:在字符串 s 后面再接一段 s,然后从下标为 1 的位置开始匹配,直到匹配子串 s(返回匹配子串 s 的第一个字符的下标)如果字符串 s 是重复的,则返回的下标一定小于 s.size( )时间复杂度是O(n∗m)?O(n*m)?O(n∗m)?,空间复杂度是O(1)O(1)O(1)Note1:find 函数的时间复杂度我不是很确定,见讨论C...原创 2020-05-07 10:07:06 · 512 阅读 · 0 评论 -
LeetCode 题解 | 1424. 对角线遍历 II(C++)
题目描述(中等难度)原题链接算法如果按照这个顺序模拟一遍,遇到是空的话就跳过,但这样会超时。其实对角线上横纵坐标和是一个定值,利用这个性质,可以正常遍历 nums,然后把每个元素加到一个二维数组中(第一维是 x + y),因为加进去的时候是倒序的,所以最后再倒序遍历一下即可时间复杂度是O(N)O(N)O(N):N 为 nums 的元素个数C++代码1class Solution {...原创 2020-04-26 14:58:38 · 804 阅读 · 0 评论 -
面试算法题-单链表快速排序
题目描述原题链接C++代码/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public:...原创 2020-03-21 17:01:43 · 697 阅读 · 0 评论 -
LeetCode 题解 | 1367. 二叉树中的列表(树的子结构 变形 C++)
题目描述(中等难度)原题链接相似题目:剑指offer | 树的子结构(递归 C++)注意:Why using isSame in is wrong,这是因为如果是用isSame只是判断了当前左右子树的根节点,并不能遍历所有的点!!!同时培养自己做算法题的良好习惯C++代码class Solution {public: // 1. 遍历二叉树的每个结点p // 2....原创 2020-03-04 15:38:13 · 285 阅读 · 0 评论 -
LeetCode 题解 | 129. 求根到叶子节点数字之和(void+全局型DFS C++)
题目描述(中等难度)原题链接算法(DFS 回溯) O(n)O(n)O(n)类似题目:LeetCode 113. 路径总和II(深搜DFS)用DFS搜索左子树和右子树(自顶向下),每当到达叶子结点时,将tmp加到ans中注意:dfs(ptr)表示已经更新了从根结点到当前结点(不包括当前结点)的表示成的数tmp时间复杂度是O(n)O(n)O(n):每个点最多被遍历一次C++代码1...原创 2020-02-19 18:40:15 · 272 阅读 · 0 评论 -
LeetCode 题解 | 37. 解数独(bool型DFS C++)
23class Solution {public: bool row[9][9] = {0}, col[9][9] = {0}, cell[3][3][9] = {0}; void solveSudoku(vector<vector<char>>& board) { for (int i = 0; i < 9; i ++ ...原创 2020-02-19 15:29:38 · 379 阅读 · 0 评论 -
LeetCode 题解 | 1339. 分裂二叉树的最大乘积(dfs递归 自底向上 C++)
题目描述(中等难度)原题链接算法(递归) O(n)O(n)O(n)乘积 = 某个节点下所有子节点的和 *(整个树的和 - 某个节点下所有子节点的和)后序遍历每个结点,更新最大值注意:先用long long存数据,另外在max函数中不要先取模 解释后序遍历的好处:后序遍历可以从叶子结点开始,先求出子树的状态,然后更新root结点,这样自底向上可以减少大量重复的计算时间复杂度是O(...原创 2020-02-11 18:56:11 · 437 阅读 · 0 评论 -
LeetCode 题解 | 1325. 删除给定值的叶子节点(自底向上递归 C++)
题目描述原题链接算法(自底向上 递归) O(n)O(n)O(n)二叉树删除结点和链表删除结点是类似的,都是找到前驱结点,例如要删除root的左子树,只需root->left = NULL我们需要删除所有值为 target 的叶子节点,那么我们的操作顺序应当从二叉树的叶子节点开始,逐步向上直到二叉树的根为止常见的二叉树遍历中,后序遍历是先遍历完所有子结点之后再遍历根结点,符合题...原创 2020-02-11 14:25:31 · 370 阅读 · 0 评论 -
牛客编程题 找出单向链表中的一个节点,该节点到尾指针的距离为K
题目描述原题链接算法动态创建单链表,然后用两个指针,一个先走k步,然后两个一起走时间复杂度是O(n)O(n)O(n),空间复杂度是O(n)O(n)O(n)代码// 2020年2月6日 星期四 23:06:12#include <iostream>using namespace std;struct ListNode { int m_nKey; ...原创 2020-02-06 23:09:52 · 311 阅读 · 1 评论 -
LeetCode 113. 路径总和II(深搜DFS void型dfs有套路)
题目描述原题链接算法(DFS深搜)这道题目和 Path Sum 基本一样,不同点在于需要把所有路径记录下来。用DFS搜索左子树和右子树(自顶向下),每当到达叶子结点时,如果这条路径正好等于sum就把它加到res中,否则直接return代码/** * Definition for a binary tree node. * struct TreeNode { * i...原创 2020-02-04 23:28:02 · 410 阅读 · 0 评论 -
字符串展开——2019年字节跳动夏令营笔试题
#include <bits/stdc++.h>using namespace std;typedef long long ll;int main(void) { #ifdef LC freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout); ...原创 2019-07-14 11:33:11 · 591 阅读 · 0 评论 -
输出蛇形矩阵
类型1:输出如下矩阵#include<bits/stdc++.h>using namespace std;int res[100][100]; void fillres(int m, int n) { vector <vector<bool> > isdone(m, vector<bool> (n, false)...原创 2019-07-14 11:06:38 · 1181 阅读 · 0 评论 -
2019年华东师大高可信软件工程夏令营机试B题——附代码
B. 整数划分单点时限:2.0 sec内存限制:512 MB对于一个给定的正整数n,希望你能将它分成仅由数字1或2或3组成的和的形式,问有多少种划分方法。举个例子:4可以被划分成1+1+1+1或2+2或3+1或2+1+1这4种形式,注意1+3和3+1视为同一种划分方法。输入格式有多组输入,每组输入由一行一个正整数n组成...原创 2019-10-02 22:29:45 · 591 阅读 · 0 评论 -
2019年华东师大高可信软件工程夏令营机试E题
E. 派对单点时限:1.0 sec内存限制:256 MB小W又在举办派对了,不过要参加小W的派对可不容易,小W有个奇怪的进场要求,首先他要求人们必须排成一队进场,然后他会给收到邀请函的n个人编号,编号从1-n(每个人编号都不一样),然后他还会添加m个奇怪的约束,每个约束形如 (u,v),表示编号为u的人必须在编号为v的人之前进场,小W觉得这样还不够有...原创 2019-07-18 21:25:11 · 579 阅读 · 0 评论 -
2019年华东师大云计算与大数据夏令营机试C题
C.能否组成正方形Description给定一组不同长度的木棍,是否可以将它们端到端连接成一个正方形?Input输入的第一行包含n,即测试用例的数量。每个测试用例以一个整数m开始(4<=m<=20),即木棍的条数。接下来是m个整数,每一个整数代表一个木棍的长度(整数范围1~10000)。Output对于每种情况,如果可以形成一个正方形,则输出一行包含...原创 2019-07-18 21:15:34 · 838 阅读 · 1 评论 -
2019年华东师大云计算与大数据夏令营机试A题
A.虫子交配Description生物学院的同学在研究一种罕见的昆虫性行为。这些昆虫具有两种不同的性别,并且它们只与异性的虫子互动,不和同性的虫子互动。在实验中,个别虫子的错误行为能够很容易地被识别,因为它们的身体上都印有数字标号。现在,给你一组虫子的互动列表,需要请你帮助生物学院的同学判断这个实验中的虫子是否有错误行为。例如,有编号1,2,3三只虫。互动列表为:1 22 3...原创 2019-07-18 20:43:39 · 1170 阅读 · 0 评论 -
2019年华东师大高可信软件工程夏令营机试A题
A. 构造序列单点时限:1.0 sec内存限制:256 MBQQ小方刚学了不下降序列,即给定n个数,a1≤a2≤⋯≤an。牛逼李给他出了个难题,给定n个整数ai,问最少需要多少次操作可以使得这个序列变成不下降序列。一次操作可以改变该数列中任意一个数加1或者减1。例如样例3,2,−1,2,11,可以对3操作一次变2,对−1操作3次变...原创 2019-07-17 22:10:22 · 1076 阅读 · 1 评论 -
EOJ 3346. 皇后问题 (标记法)
#include <bits/stdc++.h>using namespace std;#define N 100010typedef long long ll;ll row[N];//行ll col[N];//列ll dia1[2*N];//副对角线 y = -x + bll dia2[2*N];//主对角线 y = x + bint main(){...原创 2019-07-13 16:55:45 · 452 阅读 · 0 评论 -
EOJ 1690. 子序列
// 双指针#include <bits/stdc++.h>using namespace std;typedef long long LL;const int N = 1e5 + 7;int a[N];int main() { int n; LL s; int res = INT_MAX; cin >> n >&g...原创 2019-07-13 16:51:18 · 262 阅读 · 0 评论 -
EOJ 1224. 简单迷宫问题
题意:走迷宫,求最短路径,上下左右走一格花费1,走到有怪的格子花费2. 思路:将每一点的坐标和由起点到该点的距离存入结构体. 由起点开始,将该点存入优先队列,以到起点的距离dis为优先级,每次取出dis最小的,向外扩散。 相当于第一轮得出所有到起点距离为1的点,第二轮得出所有到起点距离为2的点。 注意:对普通的最短路问题,由于每个各自的花费相同,因此...原创 2019-07-13 16:48:03 · 349 阅读 · 0 评论 -
EOJ 3299. 主色调
#include <bits/stdc++.h>using namespace std;int main(void) { // cin data int n; while (scanf("%d", &n) != EOF) { int tmp = n; vector <int> vec; while (n--) { int c; ...原创 2019-05-17 14:16:21 · 379 阅读 · 0 评论 -
LeetCode 54,59,885题解 | 螺旋矩阵I,II,II(蛇形矩阵 C++代码)
文章目录LeetCode 54.螺旋矩阵 ILeetCode 59.螺旋矩阵 IILeetCode 885.螺旋矩阵 III这类题,都是纯模拟题,定义一个方向数组,然后一个变量d表示当前在哪个方向上LeetCode 54.螺旋矩阵 Iclass Solution {public: vector<int> spiralOrder(vector<vector<...原创 2020-01-29 12:17:25 · 618 阅读 · 0 评论 -
LeetCode 1131.绝对值表达式的最大值(曼哈顿距离 简单易懂)
题目描述 难度中等题解 时间复杂度O(n)看一眼时间复杂度,用暴力肯定超时,仔细想想可以把这个题抽象为求三维曼哈顿距离的最大值dist=∣xi−xj∣+∣yi−yj∣+∣zi−zj∣dist = |x_i - x_j| + |y_i - y_j| + |z_i - z_j|dist=∣xi−xj∣+∣yi−yj∣+∣zi−zj∣分析:dist这个表达式去绝对值后,xi,y...原创 2020-01-24 15:22:08 · 1586 阅读 · 0 评论 -
LeetCode题解 | 79.单词搜索(经典DFS回溯 C++)
dfs出口说明:搜索中dfs参数u=1u=1u=1时已经搜到了2个数,所以你要搜n个数,那设置出口u=n−1u=n−1u=n−1即可C++代码class Solution {public: static const int N = 1000; int n, m; int dx[4] = {0, 0, 1, -1}, dy[4] = {1, -1, 0, 0}; ...原创 2020-01-14 09:48:02 · 405 阅读 · 0 评论 -
Codeforces Round #609 (Div. 2) B.Modulo Equality(枚举)
1269B.ModuloEquation(枚举)题目描述/** * @Author: Wilson79 * @Datetime: 2020年1月9日 星期四 15:46:47 * @Filename: 1269B.ModuloEquation.cpp */// n = 2000// 算法(枚举):b[0]一定是从某个a[i]得到的,所以枚举n中情况,取最小值即...原创 2020-01-09 17:04:56 · 229 阅读 · 0 评论 -
Codeforces 1269C.LongBeautifulInteger
题目描述取出子串,然后用字符串拼接起来,判断是否满足条件,如果不满足就让子串+1/** * @Author: Wilson79 * @Datetime: 2020年1月9日 星期四 16:11:17 * @Filename: 1269C.LongBeautifulInteger.cpp */#include <iostream>#include &...原创 2020-01-09 16:13:13 · 270 阅读 · 0 评论 -
LeetCode 1254.封闭岛屿的周长(BFS)
注意:原题是求封闭岛屿数量,我改成了求封闭岛屿的周长/** * @Author: Wilson79 * @Datetime: 2019年12月16日 星期一 22:41:13 * @Filename: 1254.封闭岛屿的周长.cpp */const int N = 120;typedef pair<int, int> PII;#define x ...原创 2019-12-20 20:18:14 · 377 阅读 · 0 评论 -
走迷宫问题——边的权值相同或不同
一.走迷宫(边的权值相同)给定一个n*m的二维整数数组,用来表示一个迷宫,数组中只包含0或1,其中0表示可以走的路,1表示不可通过的墙壁。最初,有一个人位于左上角(1, 1)处,已知该人每次可以向上、下、左、右任意一个方向移动一个位置。请问,该人从左上角移动至右下角(n, m)处,至少需要移动多少次。数据保证(1, 1)处和(n, m)处的数字为0,且一定至少存在一条通路。输入格式第一...原创 2019-12-07 09:33:22 · 827 阅读 · 0 评论 -
PTA1023 Have Fun with Numbers 高精度加法(string + 进位t)
计算两个大数的和示例:11112435782134+3127489173498173498174323423算法:利用string读入数据,对两个数都reverse,然后依次相加,用t去处理进位// 利用字符串和进位t巧妙解决高精度加法#include <iostream>#include <algorithm>using namespace std;in...原创 2019-11-23 20:34:12 · 331 阅读 · 0 评论