随笔分类 -  Leetcode刷题记录

摘要:一道普通的dp。 首先,我们很容易想到,设$d[i][j]$是以$arr[i]$和$arr[j]$为结尾两个数的最长长度。那么状态转移就是$d[i][j]=max{d[k][i]}+1;(arr[k]+arr[i]==arr[j],k<i<j)$。那么我们可以写出类似下面这样$O(n^3)$的代码: 阅读全文
posted @ 2022-07-09 22:45 wegret 阅读(39) 评论(0) 推荐(0)
摘要:是一个比较普通的字典树。细节应该算是比较多(?) typedef pair<int,int> P; vector<P> flag[100007]; // first是字母,second是指向的序号 bool End[100007]; int cnt; //目前节点数 class Solution { 阅读全文
posted @ 2022-07-07 21:37 wegret 阅读(41) 评论(0) 推荐(0)
摘要:一道比较显然的贪心。 首先我们很容易想到枚举所有的排列情况,但是这样是显然不能通过的。其次我们可以贪心地考虑,思路:假设我们有一个数$n$是ABCDEF(ABCDEF都是数字),既然要找大于$n$的最小排列,我们其实只需要从个位开始考虑,变化越小的数位越好。 以数$1961283241$为例,从个位 阅读全文
posted @ 2022-07-03 16:55 wegret 阅读(36) 评论(0) 推荐(0)
摘要:考虑可以用多种解法解决该题。 首先很容易想到用$O(n^2)$的递推dp。设$d[i][j]$为到达第i站前加油次数为j时的最大油量,最后直接找终点最小值就行。鉴于数据规模比较小,stations.length<=500,因此$O(n^2)$是可以通过的。 long long d[503][503] 阅读全文
posted @ 2022-07-02 19:05 wegret 阅读(103) 评论(0) 推荐(0)
摘要:比较常规的思路就是对于[l,i]、[i+1,r]两个区间的所有可能结果进行合并。考虑到expression.length <= 20,这样的想法是可以通过的。 int num[23],cnt; int sign[23]; //sign[i]是num[i]后的符号 vector<int> dfs(in 阅读全文
posted @ 2022-07-01 11:33 wegret 阅读(27) 评论(0) 推荐(0)
摘要:int d[2][2]={-1,1,1,-1}; // -1 1 // 1 -1 class Solution { public: vector<int> findDiagonalOrder(vector<vector<int>>& mat) { vector<int> ans; int m=mat 阅读全文
posted @ 2022-06-14 22:35 wegret 阅读(24) 评论(0) 推荐(0)
摘要:class Solution { public: int heightChecker(vector<int>& heights) { vector<int> expected(heights); int t=expected.size(),ans=0; sort(expected.begin(),e 阅读全文
posted @ 2022-06-13 09:47 wegret 阅读(27) 评论(0) 推荐(0)
摘要:class Solution { public: vector<string> findAndReplacePattern(vector<string>& words, string pattern) { vector<string> ans; int t=words.size(),cnt=patt 阅读全文
posted @ 2022-06-12 17:09 wegret 阅读(23) 评论(0) 推荐(0)
摘要:DP的算法就不说了,记一种打表找规律法(大草)。 通过打表,我们发现答案如下: 2 13-4 2 15-8 2 2 3 19-16 2 2 3 2 3 3 4 117-32 2 2 3 2 3 3 4 2 3 3 4 3 4 4 5 133-64 2 2 3 2 3 3 4 2 3 3 4 3 4 阅读全文
posted @ 2021-06-23 23:53 wegret 阅读(56) 评论(0) 推荐(0)
摘要:(两年前学过,没什么印象了,重新复习一下orz。) 拓扑排序,即在一个有向图$G$中对节点进行线性排序,使图中任意一条有向边$<u,v>$,在该序列中都满足$u$在$v$前面。 举例: 该图的拓扑序是 6,1,2,3,4,5 。 又比如: 该图的拓扑序是 1,2,3,4,7,5,6,当然也可以是 1 阅读全文
posted @ 2021-06-20 22:46 wegret 阅读(63) 评论(0) 推荐(0)
摘要:拓扑排序。能得到拓扑序就是true,不能得到就是false。 vector<int> to[100005]; int in[100005]; int temp; class Solution { public: bool canFinish(int numCourses, vector<vector 阅读全文
posted @ 2021-06-20 22:21 wegret 阅读(63) 评论(0) 推荐(0)
摘要:直接找入度为$n-1$,出度为$0$的点就行了,时间复杂度是$O(n)$。 int in[1007],out[1007]; class Solution { public: int findJudge(int n, vector<vector<int>>& trust) { int t=trust. 阅读全文
posted @ 2021-06-19 22:31 wegret 阅读(57) 评论(0) 推荐(0)
摘要:脑筋急转弯。其实就是把当前节点伪装成下一个节点,取代next。 class Solution { public: void deleteNode(ListNode* node) { node->val=(node->next)->val; node->next=(node->next)->next; 阅读全文
posted @ 2021-06-19 18:09 wegret 阅读(30) 评论(0) 推荐(0)
摘要:已经连通的点可以视为集合,用并查集记录集合,搜一遍得到集合个数。设点数为$n$,边数为$s$,集合个数为$num$。那么有两种情况: 1)$s<n-1$,不能全部连通。 2)$s>=n-1$,最少操作数是$num-1$。(随便取冗边,反正能把集合都连起来就行。因为$s>=n-1$,所以是肯定能取到冗 阅读全文
posted @ 2021-06-19 16:55 wegret 阅读(75) 评论(0) 推荐(0)
摘要:“任意两点之间 有且仅有一条简单路径时,返回将所有点连接的最小总费用”,即求MST(最小生成树)。 发现数据规模不超过1000,所以可以考虑到$O(n^2)$的算法。 $O(n^2)$算出任意两点的距离。然后用prim算最小生成树,同样$O(n^2)$。(这张图是稠密图,点数$n$远小于边数$n^2 阅读全文
posted @ 2021-06-19 12:07 wegret 阅读(69) 评论(0) 推荐(0)
摘要:vector<int> ans; void dfs(TreeNode* now){ if (now==nullptr) return ; dfs(now->left); ans.push_back(now->val); dfs(now->right); } class Solution { publ 阅读全文
posted @ 2021-06-17 22:54 wegret 阅读(28) 评论(0) 推荐(0)
摘要:class Solution { public: int guessNumber(int n) { long long l=1,r=(long long)n; long long mid=((long long)1+n)>>1,temp; while (true){ temp=guess(mid); 阅读全文
posted @ 2021-06-17 22:44 wegret 阅读(29) 评论(0) 推荐(0)
摘要:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), rig 阅读全文
posted @ 2021-06-12 21:12 wegret 阅读(45) 评论(0) 推荐(0)
摘要:简单地dfs一遍即可。 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(n 阅读全文
posted @ 2021-06-12 18:56 wegret 阅读(43) 评论(0) 推荐(0)
摘要:其实就是一个求LCA的模板问题。 我的实现方法是在p、q上分别打一个标记。然后递归把标记向上传递。当找到一个拥有两个标记的节点,它就是最近公共祖先。 /** * Definition for a binary tree node. * struct TreeNode { * int val; * T 阅读全文
posted @ 2021-06-12 17:57 wegret 阅读(31) 评论(0) 推荐(0)