![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
leetcode
畏人心i
这个作者很懒,什么都没留下…
展开
-
2020-5 leetcode 928. 尽量减少恶意软件的传播 II
1.这道题和上一道题的差别在于,这道题删除节点是真的把该节点移除,同时删除原本的连接关系。而上一道题只是把感染的点变为不被感染的点。但原先的连接关系不变。2.所以在这道题中,要找的点是 只能受这个点影响而被感染的点的个数最多的那个感染点。3. 方法:对于不在intianal 中的点重新建一个图,然后DFS遍历。class Solution {public: int minMalwareSpread(vector<vector<int>>& graph, ve原创 2020-05-30 10:41:45 · 214 阅读 · 0 评论 -
2020-5 leetcode 924. 尽量减少恶意软件的传播
1.这里说的删除节点,是把这个节点从感染节点变为不受感染的节点。其原先的连接关系不变。2.题中要找的点 就是找它所处的联通分量只有它一个感染点,然后在这个集合中找一个其所处的联通分量包含节点最多,且该感染点本身序号最小。3.方法 DFS遍历图即可。class Solution {public: int minMalwareSpread(vector<vector<int>>& graph, vector<int>& initial) {原创 2020-05-30 10:01:45 · 225 阅读 · 0 评论 -
2020-5 leetcode 972. 相等的有理数
1.这个题整体思想是把给的小数化为分数来比较。最关键的部分是利用等比级数求和来求无限循环小数部分。注意:这里 p2 是等比的分母;2.分数化简函数,分数相加的函数class Solution {public: using ll=long long; ll gcd(ll a,ll b){ return b?gcd(b,a%b):a; } void sy(ll& n,ll& m){ if(n==0||m==0){原创 2020-05-30 09:37:35 · 129 阅读 · 0 评论 -
2020-5 leetcode 97. 交错字符串
1.状态dp[i][j] 是由s1 第i 个字符串 还是s2第j个字符串 与s3 的第 i+j个字符串相同而确定同时以此关系来进行转移。不要害怕自己确定的具体关系是错的,关键是自己要敢于尝试,敢于解决问题class Solution {public: bool isInterleave(string s1, string s2, string s3) { int m=s1.size(),n=s2.size(); if(m+n!=s3.size()) return原创 2020-05-29 12:01:57 · 106 阅读 · 0 评论 -
2020-5 leetcode 315. 计算右侧小于当前元素的个数
1.思路就是借助构建二叉搜索树,在构建的过程中存储和找到所需要的信息。struct node{ int val,count,simil; node* left,*right; node(int v):val(v),count(1),simil(1),left(NULL),right(NULL) { }};class Solution {public: vector<int> countSmaller(vector<int>&am原创 2020-05-29 11:50:40 · 112 阅读 · 0 评论 -
2020-5 leetcode 84. 柱状图中最大的矩形
1.单调栈找每个矩阵的高度,然后下标为宽度。2.维护单调递增栈,两个下标若不连续,中间下标的高度必定大于右端下标的高度class Solution {public: int largestRectangleArea(vector<int>& heights) { vector<int> he; he.push_back(0); for(int i=0;i<heights.size();i++){原创 2020-05-29 10:56:02 · 111 阅读 · 0 评论 -
2020-5 leetcode 699. 掉落的方块
1有点暴力的思想。对于每个掉落的方块通过intes 找到可能和它会黏在一起的方块,同时更新每个区间的方块的值。在这个过程中慢慢构成答案class Solution {public: vector<int> fallingSquares(vector<vector<int>>& positions) { vector<int> ans; map<pair<int,int>,int> in原创 2020-05-29 10:38:37 · 171 阅读 · 1 评论 -
2020-5 leetcode 827. 最大人工岛
1.采用DFS 把不同的联通分量标上不同的标记。2.然后依次遍历为0 的点看链接之后对答案的值有无影响。class Solution {public: vector<vector<int>> dir={{-1,0},{1,0},{0,-1},{0,1}}; int N; vector<vector<int>> gid; int largestIsland(vector<vector<int>>&am原创 2020-05-29 10:04:17 · 183 阅读 · 0 评论 -
2020-5 leetcode 124. 二叉树中的最大路径和
1.对于递归解决问题,1.首先弄清主体:这里主体是:1.对于这个节点而言由它作为连接点可以得到的最大路径和。以及返回给父节点的一个最大路径和。2.搞清楚最小的处理单位也就是出口,这里是空节点/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x),原创 2020-05-28 11:51:05 · 111 阅读 · 0 评论 -
2020-5 leetcode 329. 矩阵中的最长递增路径
思路:暴力搜索每一个点,得到每个点的最大递增长度然后依据子问题的答案去更新问题的答案,为了避免重复计算,采用visit 数组作为备忘录来记录重复子问题。class Solution {public: int m,n; int longestIncreasingPath(vector<vector<int>>& matrix) { m=matrix.size(); if(m==0) return 0; n=ma原创 2020-05-28 11:41:45 · 181 阅读 · 0 评论 -
2020-5 leetcode 212. 单词搜索 II
1.字典树和DFS遍历的结合。对给的表中任意一点进行DFS遍历,通过遍历过程中参数中的字典树的节点来决定遍历情况。struct node{ bool word; string str; unordered_map<char,node*> words; node(){ word=false; string str=""; }};class Tree{private: node* root;public:原创 2020-05-28 11:20:54 · 93 阅读 · 0 评论 -
2020-5 leetcode 1263. 推箱子
1.用BFS遍历来得到答案。难点:1.怎么把人和箱子的状态连接起来(这里用四维数组dist 连接,并且作为标记数组)2.分析人的下一步对箱子的影响:1.当人的下一步是箱子所处位置时,要明白:箱子所走的方向和人走的方向是一致的。2.当不是箱子所处位置时,对箱子无影响。因为是BFS 所以第一次碰到终点时,便是答案 struct Dwell{ int box_x,box_y; int man_x,man_y; Dwell(int _bx,int _by,i原创 2020-05-28 10:46:30 · 405 阅读 · 0 评论 -
2020-5 leetcode 975. 奇偶跳
1.每个位置能跳的位置由本身位置和次数的奇偶性决定。首先把每个位置 奇次跳的位置 和 偶次跳的位置找出来。方法:先对数值排序满足第一个要求。然后借助单调栈找到可以跳到位置。2.之后从最后一个位置向后遍历,确定每个位置能否跳到最后一个位置。class Solution {public: vector<int> make(vector<int>& B){ int n=B.size(); vector<int> ans(原创 2020-05-28 10:04:42 · 140 阅读 · 0 评论 -
2020-5 leetcode 736. Lisp 语法解析
1.将scope 设为全局变量,这样就可以不用弄为参数。不仅方便还解决了内层怎么任意访问外层的问题;2.对于递归解决问题。1.首先确定大框架。2.在确定最小的部分是什么,然后怎么处理。这里的大框架是:三个语法规则,对应的操作。递归写出;最小的部分是:最内层的那个括号所包含的部分;class Solution {public: vector<map<string,int>> scope; int evaluate(string expression) {原创 2020-05-28 09:26:17 · 201 阅读 · 0 评论 -
2020-5 leetcode 940. 不同的子序列 II
1.当给定的字符串中无相同字符时,可以发现:添加一个字符后,因为这个子序列集合中所有的子序列本来就是不一样的,等加一个字符后也不会一样,并且于原先相比因为加了一个字符所以也是不同于原先的子序列。所以不难推出此时不同的子序列个数因该是原先不同的子序列的个数的两倍。2.当有重复的字符时,为了避免重复出现,所以要减去上一次该字符出现的时候对应的子序列集合。可以这样理解:因为有重复的字符(现在新的子序列是由以前旧的子序列后面加上最新的一个字符所构成的子序列和旧子序列合并而成。),所以乘以两倍后会出现两次造成重复原创 2020-05-27 14:50:53 · 156 阅读 · 0 评论 -
2020-5 leetcode 1316. 不同的循环子字符串
1.利用哈希函数做到O(1) 时间内判断字符串是否相等。然后暴力搜索所有字符串进行解题。注意:怎么用哈希代表字符串判断这部分要仔细分析。#define LL long longclass Solution {public: int mode=1e9+7; int gethash(const vector<int>& pre,const vector<int>& mul,int l,int r){ return (pre[r+1原创 2020-05-27 11:40:01 · 170 阅读 · 0 评论 -
2020-5 leetcode 488. 祖玛游戏
1.用的方法很笨,就是一个球一个球的去DFS 遍历。2.需要借鉴的是,所有的剪枝函数是怎么写出来。(要自己去预想,基于所需的参数去预想)3.对于消除重复串的递归函数boom的写法要注意。以及对于一些无用情况的避免的一些操作。class Solution {public: int ans; string boom(string s,int i){ if(s.empty()) return ""; int left=i,right=i; w原创 2020-05-27 10:48:29 · 253 阅读 · 0 评论 -
2020-5 leetcode 1210. 穿过迷宫的最少移动次数
1.思路基于题中要求设计符合其要求的dfs 遍历规则罢了。注意:1.代码中为提高速度,采用了h v 来记录更新结果一求提高速度。2.同时如果出现向下探索,然后又向上这样的重复情况,也可以通过h v 的记录来防止这样的重复情况。class Solution {public: int minimumMoves(vector<vector<int>>& grid) { int n=grid.size(); vector<vect原创 2020-05-26 17:38:20 · 373 阅读 · 0 评论 -
2020-5 leetcode 1373. 二叉搜索子树的最大键值和
1.要判断该子树是否是二叉搜索树,需要四个条件:1.左子树是否是二叉搜索树2.右子树是否是二叉搜索树。3.根节点的值是否大于左子树最大值4.根节点的值是否小于右子树的最小值。2.所以选择一个数组来存储这四个量,方便判断该子树是否是二叉搜索树。注意:一旦某个子树不是二叉搜索树,那就代表包含该子树的树一定不是二叉搜索树。利用递归来完成。/** * Definition for a binary tree node. * struct TreeNode { * int val; *原创 2020-05-26 12:01:36 · 212 阅读 · 0 评论 -
2020-5 leetcode 1092. 最短公共超序列
1.方法1:动态规划,对于每个 i j 1,为了省空间,可以翻滚处理数组的行2.先找出来最长的公共子序列是存在于哪里,然后哪个最长不就代表答案最短吗。两个维护的东西都用动态规划来处理。class Solution {public: string shortestCommonSupersequence(string str1, string str2) { vector<vector<int>> d(2,vector<int>(str2.原创 2020-05-26 11:45:00 · 994 阅读 · 0 评论 -
2020-5 leetcode 330. 按要求补齐数组
1,对于任意情况,肯定可以找出其覆盖的[1,miss) 区间。因为要覆盖miss 所以添加的数字一定要<= miss ,然后覆盖的区间为[1,x] 和[x,x+miss) 即[1,x+mixx) (因为x<=miss) 所以为使区间最大,每次遇到间断处添加 miss (一个贪心选择)2.思路:刚开始利用已有的数字,去探索扩大可以覆盖的原始区间的最右端miss,然后当碰到间断时,添加miss. 之后再去探索新的间断处。class Solution {public: int minPa原创 2020-05-26 10:59:13 · 110 阅读 · 0 评论 -
2020-5 leetcode 1235. 规划兼职工作
1.思路:0.动态规划(是基于排好序的job数组进行的),dp[i] 代表做第i个工作 (包含第i个)之前的工作得到的薪酬1.将工作序号按照结束时间进行排序。然后得到与每个工作不冲突的之前的工作的下标。用prev存储。2.每个工作在选与不选中进行状态转移。1.做 那么dp[i] = dp[prev[i]] + profit[job[i]-1]; 此时的薪酬就是2.不做,:dp[i] = dp[ i-1] ,此时的薪酬就是做 第i -1 个工作之前得到的薪酬class Solution {publi原创 2020-05-26 10:42:51 · 288 阅读 · 0 评论 -
2020-5 leetcode 1349. 参加考试的最大学生数
1.思路:状态压缩,把每种学生的座位情况压缩为一个8位二进制串对于每种状态,首先验证是否和座位的好坏情况相符(验证合法性)、如果合法,在与上一行的所有合法情况匹配出一个该行在此种情况下学生的最大人数。一个简单的动态规划。class Solution {public: int maxStudents(vector<vector<char>>& seats) { int n=seats.size(); int m=seats[0].s原创 2020-05-26 10:09:23 · 319 阅读 · 0 评论 -
2020-5 leetcode 517. 超级洗衣机
1.题意:对于这m台洗衣机,是可以分组相邻,然后同时进行衣服的传递的。两台多的洗衣机可以向同一台洗衣机传递衣服,但一台多衣服的洗衣机不能向多台少衣服的洗衣机传递衣服。因为洗衣机个数m任意选所以可以理解成任意两台洗衣机之间都可以传递衣服。但注意:每次只能传递一件衣服2.思路:1.首先求平均值,然后查看每台洗衣机缺多少衣服,多多少衣服。2.因为每次只能传递一件衣服,所以步数和传递的衣服数是等价的。3.注意:题意中是可以存在多台洗衣机向一台洗衣机传递衣服,所以要注意减去重复的步数。4.答案 的出处有两个1原创 2020-05-26 09:41:31 · 195 阅读 · 0 评论 -
2020-5 leetcode 410. 分割数组的最大值
1.动态规划:1.首先搞到前缀和数组,通过它来得到各连续子数组的和2.i j 表示分成i 组,最大下标在j 处的值。3.差点忘记状态转移方程状态转移方程:每一个dp[i][j]从下标j 开始向 下标i-1 遍历,dp[i][j]=min(dp[i][j],max(dp[i-1][k],sum[j-1]-sum[k-1])); 从而得到值。class Solution {public: int splitArray(vector<int>& nums, int m原创 2020-05-16 18:27:57 · 91 阅读 · 0 评论 -
2020-5 leetcode 857. 雇佣 K 名工人的最低成本
1.k名工人 整体工资与整体工作质量存在一个比值m,这个比值m 乘以每名工人的工作质量得到实际工资2.所以,当k名工人整体工资最低时,首先要求这个比值m 要是k名工人中 最低工资/工作质量 的比值最小的那个。(既保证整体工资低,又保证实际工资都不低于最低工资)3.在得到最低的比值m 后,在去找可能的最小的工作质量的和。构成一个组合(两者乘积就是整体工资)。在所有的组合中找一个最小的乘积。class Solution {public: double mincostToHireWorkers(v原创 2020-05-16 17:46:49 · 197 阅读 · 0 评论 -
2020-5 leetcode 68. 文本左右对齐
1.选每行的单词,确定每行的单词数目。2.确定单词之间的空隙。3.构建答案的每行字符串。class Solution {public: vector<string> fullJustify(vector<string>& words, int maxWidth) { vector<string> ans; int i=0; while(i<words.size()){原创 2020-05-11 23:25:50 · 72 阅读 · 0 评论 -
2020-5 leetcode 895. 最大频率栈
维护两个map. map1记录频次为n 的数的集合。 map2 记录 数x 的频次。class FreqStack {public: map<int,vector<int>> mp1; map<int,int> mp2; stack<int> st; int maxf; FreqStack() { maxf=0; } void push(int x) { i原创 2020-05-09 20:59:39 · 177 阅读 · 1 评论 -
2020-5 leetcode 679. 24 点游戏
1.暴力搜索,2.变换数字(得到四个数字的全排列),3.每一种排列,对四种操作进行遍历(这个是固定的)。class Solution {public: bool judgePoint24(vector<int>& nums) { vector<double> ans(nums.begin(),nums.end()); return back(ans); } bool back(vector<double&g原创 2020-05-09 20:19:41 · 99 阅读 · 0 评论 -
2020-5 leetcode 726. 原子的数量
1,确定一个最小的处理单位是 一层括号加后面出现的数字。2. 对括号的递归处理,以及对后面数字的处理。3.原子之间的分隔以大写字母 和 左括号标志。借此标志来分离各个原子。class Solution {public: bool isuper(char c){ if(c<='Z'&&c>='A') return true; return false; } bool islowe(char c){ i原创 2020-05-09 19:58:52 · 160 阅读 · 0 评论 -
2020-5 leetcode 239. 滑动窗口最大值
1.利用单调栈(单调递减)来存储每一次滑动窗口的最大值的下标。注意要实时的判断单调栈的栈底值(最大)是否存在于当前窗口内。然后根据结果进行值的更新class Solution {public: vector<int> maxSlidingWindow(vector<int>& nums, int k) { if(k<2) retu...原创 2020-05-07 22:55:47 · 80 阅读 · 0 评论 -
2020-5 leetcode 664. 奇怪的打印机
1.思路:对每一段相同类型且连续的字母看成一个整体。对当前的整体,可以选择现在打印(此时打印总次数 加 1+打印后面所需最少次数)。也可以选择与后面与之类型相同的整体一起打印(此时打印次数 加这两段中间的那段字符串所需最少的打印次数,加打印后面所需最少次数)。2.实现这个思路,用的是递归加记忆化(也可以改写成动态规划)class Solution {public: int stran...原创 2020-05-07 22:50:21 · 253 阅读 · 0 评论 -
2020-5 leetcode 668. 乘法表中第k小的数
1.用二分法找,关键点:mid 除以乘法表的行数等于 mid 在该行中排第几。class Solution {public: int findKthNumber(int m, int n, int k) { int le=1,ri=m*n+1; while(le<ri){ int mid=(le+ri-1)/2; ...原创 2020-05-05 22:35:45 · 121 阅读 · 0 评论 -
2020-5 leetcode 297. 二叉树的序列化与反序列化
1.关键就是序列的格式:因为是返回字符串,那么怎么保证1.节点的值可以很方便的找到。2.节点的左右孩子可以很方便的找到/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNod...原创 2020-05-05 17:31:49 · 79 阅读 · 0 评论 -
2020-5 leetcode 1220. 统计元音字母序列的数目
1.用邻接矩阵创建一个有向图,两个节点之间有边等价于两个元音字母可以组合。2.用离散数学中的一个理论,一个邻接矩阵的n次方 所形成的的矩阵中的每个元素代表 节点 i 到节点 j 所能形成的路径长度为n 的路径的个数。3.一个长度为n 的路径代表一个 长度为n+1 的字符组合。4.所以我们求出该邻接矩阵的 n - 1 次方,然后对矩阵元素求和就是答案。class Solution {p...原创 2020-05-05 17:06:34 · 188 阅读 · 0 评论 -
2020-5 leetcode 1096. 花括号展开 II
1.关键点:1.分析出什么是最小单位。2.在最小单位中前面一个元素 乘以 { }中的 内容怎么处理,{ }中的内容乘以后面一个元素怎么处理。以及两个操作的顺序。3.重复的应用上述操作,对最单位进行处理得结果。(对于递归解决问题,一定要弄清楚处理得最小单位是什么)class Solution {public: void MUL(set<string>& s,s...原创 2020-05-05 15:07:02 · 867 阅读 · 0 评论 -
2020-5 leetcode 768. 最多能完成排序的块 II
1.关键点:要想分块后排序,等价于整体排序,那么对于这些分块来说必须原本是整体有序:即一个块中的数,必须整体大于等于前面块中的数,小于等于后面块中的数。2.所以,利用这个特点,将所给串比排序后的串做对比,检查是否满足这个特性即可(通过检查对应块中的数,是否存在于排序后的对应位置的块中)。class Solution {public: int maxChunksToSorted(vec...原创 2020-05-04 22:45:50 · 262 阅读 · 0 评论 -
2020-5 leetcode 85. 最大矩形
利用动态规划,去迭代的求出 下标i j 处,第 i 行 连续1 的长度,第 j 列连续1 的长度。然后借助这两个信息利用update 函数去求面积。class Solution {public: void update(vector<vector<vector<int>>>& recond,int begin_i,int begin_j){...原创 2020-05-04 22:08:19 · 75 阅读 · 0 评论 -
2020-5 leetcode 301. 删除无效的括号
方法采用BFS ,注意因为是返回所有可能情况,所以对于出答案的那轮要遍历完。class Solution {public: unordered_set<string> candis; int remax=INT_MAX; bool isvalid(string s1){ int n=s1.size(); int count=0...原创 2020-05-04 21:51:30 · 91 阅读 · 0 评论 -
2020-5 leetcode 778. 水位上升的泳池中游泳
1.方法一:利用优先队列(最小堆),和并查集。思路:时间从0 处开始,每一个时间点,利用最小堆搜索刚好溢满的网格点,然后遍历,并且合并(后搜索的向先搜索的合并)。当第一个节点与终点合并完后,即找到了最短时间。#include<iostream>class Solution {public: struct node{ int x,y,h; ...原创 2020-05-04 20:29:36 · 273 阅读 · 0 评论