![](https://img-blog.csdnimg.cn/ce58491c7a004b9c8d5c8eff946ab909.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
leetcode题解
文章平均质量分 51
leetcode题解专栏,常用语言为c++
wenningker
此人无趣
展开
-
【leetcode】【题解合集】
题解合集原创 2022-10-15 11:46:54 · 1888 阅读 · 0 评论 -
【c++】刷题常用技巧
自用笔记原创 2022-08-30 13:03:24 · 427 阅读 · 0 评论 -
【c++】【leetcode25】k个一组反转链表
k个一组反转链表解题思路暴力求解:k个一组进行翻转,每一次翻转之前检查剩下的结点是否有k个,如果不够k个,就不进行翻转。用指针t记录每次翻转开始前的第一个结点,因为每次翻转前的第一个结点也就是下一次翻转要接入的位置。翻转链表采取头插法。代码class Solution {public: ListNode* reverseKGroup(ListNode* head, int n) { ListNode* h = new ListNode; ListNod原创 2022-05-06 21:17:56 · 1025 阅读 · 0 评论 -
【c++】【leetcode42】接雨水(动态规划、单调栈、双指针)
接雨水解题思路:动态规划每一根柱子头顶上能接多少雨水取=min(左边最高,右边最高)- 柱子本身的高度因此只需要得到下标为i的柱子左边最高的left_max和右边最高的right_max的值就可以ans[i] = min(left_max[i],right_max[i]) - height[i]如果是每一个柱子都去遍历寻找,时间复杂度是O(n2)O(n^2)O(n2),这里可以借助动态规划去保存已经寻找过的信息。动态规划:初始化: left_max[0] = height[0]; ri原创 2022-05-06 17:43:28 · 720 阅读 · 0 评论 -
【c++】【leetcode904】水果成蓝(滑动窗口)
水果成篮解题思路使用滑动窗口求解,分别设置left指针和right指针指向窗口两边。核心是如何更新窗口的起始位置寻找到第二种水果第一次出现的位置(中间不包含第一种水果),即为下一次窗口更新的位置的起点。实现方法:先利用right指针顺着找第三种元素出现的位置,然后将left与right同位,再利用left指针回退,逆着找到第三种元素的位置,left加一即为滑窗的新开始位置。代码class Solution {public: int totalFruit(vector<in原创 2022-05-01 18:59:14 · 659 阅读 · 0 评论 -
【c++】【leetcode23】合并k个有序链表(优先队列)
合并k个有序链表解题思路如果是合并两个有序链表:两个指针分别指向第一个元素,比较大小,将小的选出来,指针后移合并k个有序链表比较k个链表中的第一个元素,取出最小的,然后指针后移。每次都要取出最小的元素,然后插入新的元素,用优先队列实现。优先队列底层是大顶堆/小顶堆,获取顶部元素O(1),插入和删除元素O(logk),每一个元素被插入一次,删除一次,时间复杂度为O(knlogk)O(knlogk)O(knlogk),最多有knknkn个顶点。代码class Solution {publi原创 2022-04-28 10:37:35 · 532 阅读 · 0 评论 -
【c++】【leetcode91】解码方法(动态规划)
解码方法题解dp[i]表示到第i-1个字母时解码的方法有多少种动态转移方程dp[i] = dp[i-1]+dp[i-2]特殊情况s[i]无法和s[i-1]组合:s[i-1]=0 or s[i-1] > 2 or (s[i-1] = 2 && s[i] > 6 ,此时dp[i] = dp[i-1]s[i]只能和s[i-1]组合,s[i]=0,此时dp[i] = dp[i-2]class Solution {public: int numDecodi原创 2022-04-26 14:22:04 · 929 阅读 · 0 评论 -
【c++】【leetcode62】不同路径1/2,路径和(动态规划)
不同路径解题思路使用动态规划算法dp[i][j]代表走到第i行第j列有多少路径dp[0][j]只能由dp[0][j-1]走来dp[i][0]只能由dp[i-1][0]走来if(i == 0 && j != 0)dp[i][j] = dp[i][j - 1];else if(j == 0 && i != 0)dp[i][j] = dp[i - 1][j];else if(!i && !j)continue;else dp[i][j] = d原创 2022-04-25 17:35:50 · 737 阅读 · 0 评论 -
【C++】【leetcode200】岛屿数量(DFS、BFS)代码优化
岛屿数量DFSclass Solution {public: int n,m; void dfs(vector<vector<char>>& grid, vector<vector<int>>& visited,int i,int j) { if(i < 0 || i > m - 1 || j < 0 || j > n - 1 || grid[i][j] == '0')return原创 2022-04-15 21:37:25 · 474 阅读 · 0 评论 -
【c++】【leetcode207】课程表(拓扑排序)
leetcode课程表解题思路求拓扑排序,从入度为0的点出发去遍历vector<vector<int>> edges(numCourses);记录每个顶点的关联顶点vector<int> degree(numCourses);记录每个顶点的入度class Solution {public: bool canFinish(int numCourses, vector<vector<int>>& prerequisite原创 2022-04-25 15:24:38 · 1216 阅读 · 0 评论 -
【c++】【leetcode679】24点游戏(暴力枚举dfs+代码优化)
leetcode 679: 24点游戏解题思路1、整数转换为浮点数求解,因为除法可能会出现小数2、浮点数和24比较,确定一个精度误差3、枚举所有的可能,如果达到24进行剪枝核心在4个数中任选两个数进行四则运算,假设为a op b = x,此时在数组中删除a和b,把x加入数组中,在剩下的三个数里任选两个进行四则运算。当数组中只剩下一个数时,说明运算完成,与24比较即可。代码class Solution {public: const double eps = 1e-8;原创 2022-04-25 10:39:28 · 2764 阅读 · 0 评论 -
树的路径和总结:【leetcode124,543,2246】
解题思路一棵保存信息的树如何去递归?分析单独的子树要进行什么操作分析这颗子树要返回什么东西示例1、二叉树的直径每一棵子树的直径是其子树+1返回的当前结点的直径(左边的直径和右边的直径取最大)2、二叉树的最大路径和每一棵子树的路径和max(左孩子路径和,有孩子路径和)+根节点的值,如果左孩子或者有孩子路径和为负数,则直接砍掉不要返回当前子树的最大路径和代码如下leetcode543二叉树的直径class Solution {public: int ans =原创 2022-04-18 16:34:28 · 736 阅读 · 0 评论 -
【C++】【leetcode130】被围绕的区域(DFS)
被围绕的区域DFS解题思路图的深度优先搜索这里有一个思路:利用占位符去标记,就不需要有一个新的标记数组class Solution {public: int n, m; void dfs(vector<vector<char>>& board, int x, int y) { if(x < 0 || y < 0||x > n - 1 || y > m - 1 || board[x][y] != 'O')r原创 2022-04-15 19:34:54 · 359 阅读 · 0 评论 -
【c++】【leetcode.77.797】组合问题/所有路径,回溯算法
回溯算法原创 2021-12-14 14:10:51 · 1009 阅读 · 0 评论 -
【c++】【leetcode386】字典序排序
leetcode 386 字典序排序解题思路要求线性时间算法空间花销为常数观察字典序排序能得出以下结论:每一组数以10为分界如果到某个以9结尾的数或者到最后一位数,就说明当下这一组数结束了使用递归会有额外的空间花销,所以这里使用迭代去实现class Solution {public: vector<int> lexicalOrder(int n) { vector<int> ans(n); int number =原创 2022-04-18 17:16:02 · 892 阅读 · 0 评论 -
【c++】【leetcode547】省份数量
leetcode547省份数量解题思路并查集1、find()函数,发现x的根2、Union()函数,合并代码class Solution {public: //发现x的根 int find(vector<int> &parent, int x) { if(parent[x] != x) { parent[x] = find(parent,parent[x]); } return par原创 2022-04-12 17:10:16 · 488 阅读 · 0 评论 -
【c++】【leetcode128】最长连续序列(含set用法)
leetcode 最长连续序列解题思路用哈希表存储所有的数遍历哈希表如果num-1在哈希表中,说明该元素不是根,忽略,如果num-1不在哈希表中,该元素为根,查找该元素的最长序列关键在于如果避免重复查找时间复杂度分析:代码class Solution {public: int longestConsecutive(vector<int>& nums) { if(nums.empty())return 0; //用集合set存原创 2022-04-12 15:32:10 · 611 阅读 · 0 评论 -
【c++】【leetcode 99】恢复二叉搜索树
恢复二叉搜索树解题思路二叉搜索树的中序遍历应该是升序排列,如果不是升序排列说明中间出现了问题。1、得到二叉搜索树的中序遍历2、找到不符合顺序的两个值进行交换,即当前数大于下一个数的值如:12375648,找到第一个顺序不符的7,和第二个顺序不符的4,把两个数进行交换就可以恢复正序时间复杂度:O(n),遍历一遍即可得到结果空间复杂度:O(n)代码/** * Definition for a binary tree node. * struct TreeNode { * int原创 2022-04-03 17:16:11 · 1147 阅读 · 0 评论 -
【c++】【leetcode 56】合并区间
解题思路1、按照区间起点从小到大排序2、每一次比较答案中最后一个区间终点和未遍历的区间点3、若起点小于等于终点,说明有区间重叠,选取两个区间较大的终点作为新的终点时间复杂度:O(nlogn)代码class Solution {public: vector<vector<int>> merge(vector<vector<int>>& intervals) { //二维数组按列排序 sort(in.原创 2022-03-31 21:08:35 · 593 阅读 · 0 评论 -
【c++】【leetcode 49】字母异位词分组(自留)
解题思路字母异位词:单词使用的字母和数量是相同的,仅仅是排列不同。排序+计数的思想字母异位词排序之后单词排列一致哈希表的键值为排序之后的单词,键值对应的值为一组字母异位词。代码class Solution {public: vector<vector<string>> groupAnagrams(vector<string>& strs) { unordered_map<string,vector<strin.原创 2022-03-28 17:36:53 · 1052 阅读 · 0 评论 -
【c++】【leetcode 31】下一个排列
解题思路下一个比当前字典序大的排列有如下特征:(假设为[1,3,2,4])1、交换的位次是最靠后的,比如这里交换之后1和3保持不变2、从小到大排列是字典序最小的3、从大到小排列是字典序最大的从后往前找到第一个逆序nums[i] > nums[i - 1],即与后面的交换的为nums[i-1]在后面的n-i个数里,找到与要交换的数最接近的进行交换交换完成之后,把剩下的逆序改为正序排列,保证交换完之后最小时间复杂度:最坏的情况下需要遍历三次数组,因此时间复杂度为O(3n)空间复杂度.原创 2022-03-27 16:32:33 · 1494 阅读 · 0 评论 -
【c++】【leetcode 47】全排列II
解题思路参考组合总和该解题思路来自代码随想录如果used[i-1]为真,说明我还在取i-1这一支上的树,还没到同层如果used[i-1]为假,说明i-1这一支已经结束了,现在开始同层的另一支代码class Solution {private: vector<vector<int>> result; vector<int> path; void backtracking (vector<int>& nums, ve原创 2022-03-01 11:21:03 · 511 阅读 · 0 评论 -
【c++】【leetcode16】最接近的三数之和
解题思路与三数之和同样的思路:https://blog.csdn.net/wenningker/article/details/121740513?spm=1001.2014.3001.5502双指针解题,三个数分别为nums[i],nums[left],nums[right],表示从第i个数出发,找到合适的nums[left]和nums[right]ans[0]记录差值,ans[1]记录三数之和1、将数组进行升序排序2、sum = nums[i] + nums[left] + nums[rig原创 2022-02-25 15:06:21 · 507 阅读 · 0 评论 -
【c++】【leetcode 40】组合总和II
解题思路回溯+去重与组合问题差不多的做法,该问题需要去重代码class Solution {public: vector<vector<int>> ans; vector<int> path; vector<vector<int>> combinationSum2(vector<int>& candidates, int target) { sort(candidates.b原创 2022-03-01 09:50:10 · 443 阅读 · 0 评论 -
【c++】【leetcode11】盛水最多的容器,使用双指针求解
解题思路看到这个题,一开始打算用动态规划求解,看到数据范围就觉得要超出时间限制,果然超出。寻求线性时间算法双指针求解:原理很简单,left和right指针分别指向两边,不断往中间缩进,记录最优结果即可。代码class Solution {public: int maxArea(vector<int>& height) { int n = height.size(); int ans = 0; //两个指针指向两边.原创 2022-02-25 19:15:02 · 573 阅读 · 0 评论 -
【c++】【leetcode3】 无重复最长子串,哈希表实现
解题思路滑动窗口+哈希表用unordered_map<char, int>temp_s记录单个字符和下标,记录每一次开始的下标left;如果第i个字符不在哈希表中,就把这一个字符加进去,如果第i个字符在哈希表中,则left从i+1开始,子串长度为i-left+1注:找到的某一个字符不仅要在哈希表中,而且要在left和i之间才算,所以这里限制if (it != temp_s.end()&&it->second>=left)代码class Solutio.原创 2021-12-02 11:00:09 · 864 阅读 · 0 评论 -
【c++】【leetcode506】相对名次,用map实现
解题思路map底层实现是一棵红黑树,按照key值升序排列,题目给出分数各自不同分情况讨论:n=1:这个人就是金牌n=2:两个人比较一下得出金银牌n>=3用一个map<int,int>temp来存放分数和下标值(下标值代表第几位)。根据排序的结果从第1到n-3位的名次就是他们分数的名次,我们已知map是升序排列,因此在map中的第一位名次是n,以此类推。在map中的最后三位分别是金银铜牌。map查找的时间复杂度是O(logn),最终的时间复杂度是O(n*logn).原创 2021-12-02 10:58:03 · 590 阅读 · 0 评论 -
【c++】【leetcode15】 三数之和,双指针实现
解题思路双指针解题,三个数分别为nums[i],nums[left],nums[right],表示从第i个数出发,往后找到nums[left]和nums[right]解题步骤:1、将数组进行升序排序2、sum = nums[i] + nums[left] + nums[right];sum<0,左指针向后移动sum>0,右指针向前移动sum=0,保存结果,左右指针同时向中间移动注:当某一个指针指向的下一个值和当前值相同时,指针继续移动,避免出现重复解在nums数组中,从第.原创 2021-12-06 09:49:53 · 564 阅读 · 0 评论 -
【c++】【leetcode133】克隆图,利用广度优先搜索
题目要求使用深拷贝,关于浅拷贝和深拷贝参见c++浅拷贝和深拷贝解析:利用广度优先搜索,借助队列和哈希表实现,时间复杂度O(n),空间复杂度O(n)哈希表用来存储原始节点和对应的新节点,同时用来判断某个结点是否被访问过广度优先搜索借助队列实现由于是深拷贝,要借助关键词new来实现代码实现class Solution {public: Node* cloneGraph(Node* node) { if (node == nullptr) { .原创 2022-02-24 09:36:34 · 300 阅读 · 0 评论 -
leetcode刷题笔记
sqrt()函数得到的结果是浮点型int a=10;sqrt(a)=3.168…int b=(int)sqrt(a)求整数位数int m=(int)log10(n)+1char转换为intchar c='9';int a=(int)(c-'0');//此时a=9int n=1;char c=(char)(n+'0');//此时c=‘1’reserve函数reserve(s.begin(),s.end())//反转字符串...原创 2021-11-04 10:56:13 · 3309 阅读 · 0 评论 -
【c++】【leetcode151】反转字符串里的单词,两种解法
解题思路1、利用一个额外的数组把每一个单词截下来,再倒叙保存结果2、不使用额外空间的解法:去除字符串中多余的空格翻转整个字符串翻转单个字符串去除字符串中多余的空格,不调用系统自带的erase函数,因为时间开销比较多,自己写一个双指针的方法代码:使用额外空间ac100%class Solution {public: string reverseWords(string s) { int n = s.size(); vector<string.原创 2021-12-20 21:01:14 · 987 阅读 · 0 评论 -
【c++】【leetcode349】求两个数组交集,用set实现
解题思路求解两个数组的交集很简单,该题解是学习如何写优秀的代码。代码class Solution {public: vector<int> intersection(vector<int>& nums1, vector<int>& nums2) { unordered_set<int> result_num; //set的初始化,迭代器or地址初始化,如果set提前定义可以用insert初始化原创 2021-12-16 12:18:46 · 1015 阅读 · 0 评论 -
【c++】【leetcode807】保持城市天际线
解题思路某位置所能加到的最大值是所在行的最大值和列的最大值的较小值1、找出每一行和每一列的最大值2、每一个位置累加代码class Solution {public: int maxIncreaseKeepingSkyline(vector<vector<int>>& grid) { int n=grid[0].size(); //第一行存放行的最大值,第二行存放列的最大值 vector<vector&.原创 2021-12-13 13:34:47 · 476 阅读 · 0 评论 -
【c++】【leetcode794】有效的井字游戏
很无聊的一个题……解题思路游戏结束的三种情况1、玩家1获胜,此时X的个数=O的个数+12、玩家2获胜,此时X的个数=O的个数3、无人获胜,棋盘满了,此时X的个数==O的个数+1,X+O=9代码class Solution {public: bool validTicTacToe(vector<string>& board) { int xCount=0,oCount=0; for(int i=0;i<3;i++)原创 2021-12-10 10:22:56 · 2876 阅读 · 0 评论