- 博客(97)
- 收藏
- 关注
原创 二分图最大完美匹配
左边寻找和右边相邻的边,如果右边还没有和左边进行连线,那么匹配成功。如果右边已经进行连线,那么考虑左边是否能更改连线,换一个右边。匈牙利算法 O(mn)
2023-09-01 19:32:16
253
原创 二分图-染色法-dfs
2. dfs当前边为1 他的临边为2 看是否满足条件。1.判断一个图是否是二分图当且仅当图中不包含奇数环。3. 注意图有可能不是连通图。
2023-09-01 17:25:53
445
原创 spfa-最短路-判断是否有负环
需要注意的是 负环不一定从1开始 ,即每个点都是起点,所以最初需要把每个点都加进去。cnt[]用来判断最短路的边数,当边数 >= n 说明在负环这里一直循环。只有当dist[a] 有变小的可能时, dist[b]才有变小的可能。通过队列进行更行可能会变小的路径。spfa - 判断是否有负环。通过cnt[]数组进行判断。适用于有负权边的情况。时间复杂度O(mn)
2023-08-31 15:40:47
89
原创 最短路-朴素的dijkstra算法
先进行初始化 dist[1] = 0, dist[i] = +无穷 s: 当前已经确定最短距离的点的集合。用t更新其他点的距离 dis[x] > dit[t] + dis[t -x]找到 t : 即不在s中的距离原点最近的点。进行n次遍历 ,求解到n个点的最短路。1.1 边权都是正数。
2023-08-29 19:25:05
136
原创 LeetCode 2389. 和有限的最长子序列
简单题,对于“子序列 是由一个数组删除某些元素(也可以不删除)但不改变剩余元素顺序得到的一个数组。文章所给出的这句话的意思是即可以随意的更改顺序也不会影响结果,那么就对数组从小到大排列,一个一个判断,看满足要求的最长序列。
2023-03-17 19:47:09
98
原创 vscode 安装以及应用教程
1.安装教程https://blog.youkuaiyun.com/weixin_37590454/article/details/894365772.使用教程转载
2021-10-30 10:28:29
156
原创 leetcode 78. 子集
题解dfs+ 剪枝?回溯从当前位置开始搜索,有两种选择,要 或者 不要 当选择的次数和数组的次数相同的时候就是递归终止的条件。代码class Solution {public: vector<int>t; vector<vector<int>> ans; //dfs + 剪枝 void dfs(int cur, vector<int>&nums){ //递归结束
2021-06-20 19:43:09
129
原创 leetcode 76. 最小覆盖子串
题解双指针还是有一些逻辑的左右两个指针分别记录左右区间范围,count 记录当前窗口是否满足条件,如果满足条件缩小窗口范围,找到当前满足条件的最小范围,之后记录结果,然后左指针右移,继续查找。这里还给出了s.substr 的使用代码如下:s1=S.substr(1,3);//在字符串S中,复制从位置1开始长度为3的字符串;代码class Solution {public: string minWindow(string s, string t) { vector
2021-06-19 09:49:15
209
原创 leetcode 75. 颜色分类
题解sort 排序出来的结果就是从小到大代码class Solution {public: void sortColors(vector<int>& nums) { sort(nums.begin(),nums.end()); }};
2021-06-18 10:28:20
107
原创 leetcode 72. 编辑距离
题解dp 动态规划 很经典的一道题目dp[i][j] 表示 word1 到 i 位置转换为 word2 到 j 位置的最小步数当 word1[i] == word2[j] 时,dp[i][j] = dp[i-1][j-1]当 word1[i] != word2[j] 时,dp[i][j] = min(dp[i - 1][j - 1] , dp[i-1][j],dp[i][j-1]) + 1其中还包含初始化操作当word2字符串为空,word1变为word2只需要删除当时存在的字符即可当word
2021-06-17 18:55:33
121
原创 leetcode 70. 爬楼梯
题解递推上第i阶楼梯有两种方法,第一种是第i-2 阶 + 2阶 ,另一种是第i-1阶 + 1阶其中 只上1阶的方法有一种,上两阶的方法有两中。注意循环不满足的边界条件以及初始化条件,因为有可能数组不满足这个条件代码class Solution {public: int climbStairs(int n) { vector<int>f(n); f[0] = 1; // cout<<f[0]<<f[1]
2021-06-16 08:52:39
89
原创 leetcode 64. 最小路径和
题解呀 独立做出来的,果然 熟能生巧还和昨天的那个一样,动态规划dp[i][j] 表示从左上角走到i,j点时最短距离,那么dp[i][j] = grid[i][j] + min(dp[i -1][j],dp[i][j-1])初始化是第一行第一列的最短路径就是到这点时这行和这列的数的总和。有什么不对的或者简便的算法欢迎指正~代码class Solution {public: int minPathSum(vector<vector<int>>& grid
2021-06-14 09:52:42
124
原创 leetcode 62. 不同路径
题解动态规划f(i,j) 表示从左上角到(i,j) 点的路径和,那么走到ij 的前一点到ij 有两种方式那么 f(i,j) = f(i-1,j) + f(i,j-1)其中初始化 f(0,0) = 1,f(i,0) = 1,f(0,j) = 1,因为从左上角走到这几点的位置只有一条路径。代码class Solution {public: int uniquePaths(int m, int n) { vector<vector<int>> f(m,
2021-06-13 08:48:14
87
原创 leetcode 56. 合并区间
题解双指针需要把区间先排一下序左指针指向区间最左边的位置,右指针指向区间最右边的位置,t 来控制上个区间最右边的位置如果下个区间可以和上个之前的合并,那么进行更新,知道到这个位置没有可以合并的区间为止,之后更新左指针继续进行看这个区间可以合并的最大范围。如果不理解的可以先看一遍代码欢迎指正和提问~代码class Solution {public: vector<vector<int>> merge(vector<vector<int>>
2021-06-09 17:00:07
82
原创 leetcode 55. 跳跃游戏
题解题目还是比较好懂的,贪心算法,只要能满足一个步骤跳到最后就可以。即当存在满足两个条件的这个就可以跳到最后一个。1.可以跳到当前位置2.在当前位置时,可以跳的最远具体大于等于最后一个。代码class Solution {public: bool canJump(vector<int>& nums) { int n = nums.size(); int maxn = 0; for(int i = 0; i < n
2021-05-04 14:28:37
117
原创 leetcode 53. 最大子序和
题解简单的动态规划吧算是还是比较简单的题目首先计算sum的值,如果和的值大于0那么这一段的和就对后面那个数有用,否则,就重新从下一个数开始,然后取最大值。代码class Solution {public: int maxSubArray(vector<int>& nums) { int n = nums.size(); int ans = nums[0],sum = 0; for(int i = 0; i < n;
2021-05-02 10:52:45
101
原创 leetcode 49. 字母异位词分组
题解题目还是比较容易理解的,主要是map的应用,用排序好的map作为键,然后这个键索引着所有着排序之后和他相同的string代码class Solution {public: vector<vector<string>> groupAnagrams(vector<string>& strs) { unordered_map<string, vector<string>> mp; for(str
2021-05-01 10:43:33
101
原创 leetcode 48. 旋转图像
题解其实算是思维题?如果题目不说只在这个矩阵上来用完全可以在开辟一个矩阵来进行填充所以这道题的难点就在于只能在这个矩阵上进行交换所以只能进行矩阵里元素的交换而不能进行操作等。然后就想如何进行交换呢然后就要分步骤进行交换思路:先上下进行水平翻转然后在进行对角线翻转即可。可以尝试一下然后记住就可,其他的翻转也可按照相同的思路进行。代码class Solution {public: void rotate(vector<vector<int>>&
2021-04-24 15:23:39
79
原创 leetcode 46. 全排列
题解水题? 主要是c++ 自带全排列函数,所以很好解决,记住怎么应用那个就可以。然后就是需要注意的是在排列过程中先sort一下,否则就会从当前那个值之后进行排列,排列的不全。代码class Solution {public: vector<vector<int>> permute(vector<int>& nums) { int n = nums.size(); vector<vector<int>
2021-04-23 17:03:26
79
原创 leetcode 42. 接雨水
题解方法一:暴力,从左到右遍历一次,当前位置所能接的最大雨水的值为当前位置的左边的最大值和当前位置的右端的最大值的最小值减去当前位置的值。方法二:先存储好每个位置的左边最大值和右边最大值,其余步骤和方法一一样,他俩应该是互补的,一个时间复杂度高,一个空间复杂度高。方法三:堆栈代码方法一class Solution {public: int trap(vector<int>& height) { //暴力大法好hhh,什么叫做困难题。。。什么是快乐星球
2021-04-16 16:16:25
133
原创 leetcode 39. 组合总和
题解求目标解的组合数,dfs很容易解出。对于每一个数,都有两种办法 选择 或者不选择来选择下一个,选择的话在是否继续选择还是不选择选择下一个。官方题解写的很清楚官方题解代码class Solution {public: void dfs(vector<int>&candidates,int target,vector<vector<int>>&ans,vector<int>& combine,int idx){
2021-04-15 11:17:29
85
原创 leetcode 34. 在排序数组中查找元素的第一个和最后一个位置
题解昨天,没做,今天要做两道题了。。。。很简单 二分 之前JAVA老师也让用JAVA写过,虽然忘了,但是思路还是一样的。代码class Solution {public: vector<int> searchRange(vector<int>& nums, int target) { vector<int> a; int n = nums.size(); if(n == 0){
2021-04-15 09:56:37
84
原创 leetcode 33. 搜索旋转排序数组
题解看评论说不知道这道题的意义所在,emm确实有的题暴力就可以解决主要看思路什么的吧 二分的话效率会更高,所以这里给出两种解法,大家还可以联系一下二分算法。二分的思路说一下吧,要不然可能不太理解先判断左右两边是否为有序数组,不管怎么分,左右两边必有一个有序数组,有过左边有序,就判断目标值是否在左区间的范围内,如果在的话那就缩小,不在的话那么一定就在右边如果右边有序,原理和上述方法相同,来判断缩小的区间范围。先找到有序的区间范围然后先判断有序的区间段否则为另一部分,这样判断比较方便。不太理解的话
2021-04-13 10:00:34
85
原创 leetcode 32. 最长有效括号
题解i’m coming~终于又回来了~动态规划难想不到dp[i] 表示以第i 个字符为结尾的最长连续的括号长度如果 s[i] = ‘(’那么dp[i] = 0如果 s[i] = ‘)’那么就需要分情况来判断如果 s[i - 1] =’(’那么 dp[i] = dp[i - 2] + 2 这里需要满足 i - 2 >= 0 如果不满足的话那么dp[i] = 2。如果s[i - 1] = ‘)’那么需要判断 第 i - dp[i - 1] - 1 这个位置是否为‘(’ ,如果
2021-04-12 16:15:08
81
原创 leetcode 22. 括号生成
题解这个思路绝了递归利用剩余的左括号数和右括号数当左括号数和右括号都为0时,那么存在一个正确组合那么正确组合的条件有哪些呢(1)剩余的左右括号相同,那么只能放置左括号,不能放置右括号(2)剩余的左括号小于右括号,那么既可以放置左括号 也可以放置右括号,那么先放置左括号,注意放置的时候注意长度,不要忘了剩余的左括号不能小于零然后也可以进行放置右括号,放置右括号不需要满足什么条件,因为前面已经有了大条件,即左括号的剩余数小于右括号的剩余数(3)剩余的左括号 大于右括号 那么一定没有符合条件的,
2021-03-21 11:05:37
67
原创 leetcode 21. 合并两个有序链表
题解链表简单题两个有序链表的合并问题新建一个有头指针的链表,然后新建一个指针指向他,在l1 和 l2 中进行移动,l1的数字小,那么把l1加进去,后移一个,l2同理当出现一个为空时后面的也不需要进行比较了。直接向后填充即可。代码/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(n
2021-03-20 09:43:19
79
原创 leetcode 20. 有效的括号
题解数据结构典型的堆栈。应该还是比较经典的先放入一个字符,然后和下一个比较是否成对,成对的话之前的弹出,没成对的话这个也放入堆栈。需要注意的是1.可以进行一个先行判断 可以判断字符串的长度是否是偶数,是奇数的话直接return false2.还有注意一开始堆栈为空的情况,那么需要判断是否为空,为空的话先放进去一个,要不然也没有办法进行匹配。代码class Solution {public: bool isValid(string s) { //暴力堆栈,谁让这里就给
2021-03-20 08:57:55
66
原创 leetcode 19. 删除链表的倒数第 N 个结点
题解普通链表操作,暴力解决,没有实现一次遍历就可以的方法首先遍历一次找出链表的长度,然后 先设定一个空节点 长度-n + 1的下一个即为要删掉的那个节点代码/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : va
2021-03-18 11:16:57
121
原创 leetcode 17. 电话号码的字母组合
题解又是双指针 of course no回溯法把数字和相应的字符一一对应比如当第一个数字对应的第一个字符,然后就索引下一个数字,查找他所对应的字符,这样就可以把字符一一对应完其实思路还是比较简单地,感觉暴力应该也可以代码class Solution {public: vector<string> letterCombinations(string digits) { vector<string> combinations; if
2021-03-17 11:16:44
81
原创 leetcode 15. 三数之和
题解双指针感觉就是对题目的深度理解,首先遍历a 那么就是找 b + c = -a 的情况。首先不能进行暴力解决,所以要有一定的简化,b 代表左指针,c 代表右指针,对于去掉重复的,需要先对数组从小到大排序,看到重复的直接过掉即可,这样的话,b 从左向右变大,c 从右向左遍历,保持平衡,最后当两个数同一位置的时候那么遍历结束。先打了一遍官方代码,感觉逻辑还是有些混乱的,建议看第二份代码,还是比较清晰的。代码class Solution {public: vector<vector&
2021-03-16 10:12:30
95
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人