![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
LeetCode题解
文章平均质量分 92
只会写臭虫
这个作者很懒,什么都没留下…
展开
-
LeetCode1025. 除数博弈
解法一:dp,仔细想易知dp[i]的结果是由dp[1]到dp[i-1]的结果来决定的,即如果dp[i]为true,那么dp[j](0<j<i-1)必然为false,并且i和j满足i%(i-j)==0。代码:class Solution {public: int dp[1005]; bool divisorGame(int N) { for(int i=2;i<=N;i++){ for(int j=i-1;j>0;j--.原创 2020-08-19 10:55:29 · 244 阅读 · 0 评论 -
Leetcode K 个一组翻转链表
思路:先找出这k个结点组成的链表,然后利用常规的单链表翻转方法进行翻转。需要一个指针lastEnd记录已经翻转后形成的链表的尾结点,还需要一个指针nextHead记录下一个待翻转的链表的链头,然后需要start和end记录当前需要翻转的k个结点组成的链表的表头和表尾,需要注意的是在调用reverse()进行子链表翻转之前需要把end的next赋值为NULL,然后翻转后新的链表的表头为end,表尾是next。代码:class Solution {public: ListNode* rever.原创 2020-05-23 12:06:05 · 289 阅读 · 0 评论 -
LeetCode 两数相加(链表)
思路:因为链表的表示是逆序的,所以思路就是模拟两个数从个位相加的操作。考虑上进位。解法1: 首先我的想法是尽量利用现有的结点,通过改变结点值和指点的指向,因为题目里说了都是非空链表,所以我选择将l1链表作为最后返回的链表。然后分为了三种情况进行考虑,具体解释在代码注释里。代码:class Solution {public: ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { ListNode* head=l1; /.原创 2020-05-22 17:07:09 · 465 阅读 · 0 评论 -
918. 环形子数组的最大和
解法1:可以将这个数组复制一段接在原数组的后面,然后分别从1到n开始,进行普通子数组最大和的解法。但是这样时间复杂度为n^2。这题的数据量是30000,显然不行,所以应该考虑nlogn或者n的解法。解法2:分成两种情况,一是没有首尾相连,就用正常求最大子数组和的方法。二是有首尾相连的情况,那么这种情况的解法就是将数组求和减去其中一段最小子数组和,但是这种需要考虑一种特殊情况,就是加入数组都小...原创 2019-07-28 00:02:32 · 216 阅读 · 0 评论 -
LeetCode 309. 最佳买卖股票时机含冷冻期
代码中有注释,需要注意的一点是dp[10000][3]定义的是第i天结束后的状态。用0表示持有股票,1表示不持有,2表示冷冻期代码:class Solution {public: int dp[10000][3]; //dp定义了第i天结束后的状态,0代表不持有,1代表持有,2代表是冷冻期 int maxProfit(vector<int>& price...原创 2019-06-30 20:12:03 · 108 阅读 · 0 评论 -
LeetCode123. 买卖股票的最佳时机 III
定义dp[n][k][m],表示第n天结束后,状态为m,已经购买的股票数为k。m=1表示持有股票,m=0表示当前不持有股票。k的取值为0,1,2。写的时候迷迷糊糊的,感觉还是没有掌握精髓。。。。代码:class Solution {public: int dp[100000][3][2]; int min_int = -2000000000; //不存你在的状态设置为很小,...原创 2019-06-30 20:09:04 · 264 阅读 · 0 评论 -
LeetCode122. 买卖股票的最佳时机 II
class Solution {public: int maxProfit(vector<int>& prices) { int ans=0; for(int i=1;i<prices.size();i++) if(prices[i]>prices[i-1]) ans...转载 2019-06-30 16:02:11 · 86 阅读 · 0 评论 -
LeetCode 121 买卖股票的最佳时机
代码:class Solution {public: int maxProfit(vector<int>& prices) { int minp=100000000; //当前最小的price int size=prices.size(); int maxp=0; //当前最大的利润 for(int ...转载 2019-06-30 15:59:44 · 206 阅读 · 0 评论 -
LeetCode 264 丑数
我的解法是,一个数整除2、3、5后得到的数还是丑数的话,那么这个数一定是丑数,但是果不其然的超时了。。。class Solution { //超时public: int f[1000000]; //表示以i为下标的数是否是丑数 int d[3]={2,3,5}; int nthUglyNumber(int n) { if(n==1) ...原创 2019-06-30 14:40:38 · 96 阅读 · 0 评论 -
LeetCode 322. 零钱兑换(完全背包问题(DP)或DFS)
dp解法:class Solution {public: int dp[1000000]; int coinChange(vector<int>& coins, int amount) { for(int i=1;i<=amount;i++){ dp[i]=2000000000; for...原创 2019-06-28 21:36:19 · 389 阅读 · 0 评论 -
685. 冗余连接 II(并查集)
这题与684. 冗余连接不同的是,这里的图是有向图,要求去除一条边,使得剩下的点和边组成一颗树。树的定义:有且只有一个结点的入度为0,其他节点的入度为1。所以考虑两种情况:①没有入度为2的结点:根据题意,这个图中一定有环,那么这种情况的判断就跟684. 冗余连接的解法一样了。把图看成无向图,利用并查集判断边连接两个点是否连通,若连通,输出这条边。②这棵树中有一个结点入度为2,这种情况里...原创 2019-07-03 19:30:31 · 184 阅读 · 0 评论 -
LeetCode 399. 除法求值(并查集+BFS)
把各个string看做顶点。然后a/b的值看做边。对于每个查询a/b,我们要求的就是从a到b的一条路径,答案就是这条路径上的边权之积。我用的是BFS代码如下:class Solution {public: unordered_set<string>st; //存放顶点的集合 map<pair<string,string>,double>mp...原创 2019-07-03 14:02:36 · 555 阅读 · 0 评论 -
LeetCode 934. 最短的桥(DFS+BFS)
思路:先利用dfs或者bfs找到其中一个连通分量,并将这个连通分量里的格子设置为2,然后再利用bfs从这个连通分量中的结点开始扩展(将0的格子扩展为2),直到扩展到为1的格子结束,此时的路径最短。代码:class Solution {public: struct p{ int x,y,s; p(int xx,int yy,int ss){ ...原创 2019-07-05 19:20:57 · 574 阅读 · 0 评论 -
LeetCode 947. 移除最多的同行或同列石头
我没看懂这道题是什么意思,网上的解析是:把在同一行或者同一列的两个石头看做是连通的,然后利用并查集求连通分量个数。答案=石头总数n-连通分量个数。代码:class Solution {public: int f[1010]; int getf(int u) { return f[u]==u?u:f[u]=getf(f[u]); } v...原创 2019-07-05 20:49:37 · 191 阅读 · 0 评论 -
LeetCode 48. 旋转图像
方法1:先进行矩阵转置,再将矩阵每一行逆序。class Solution {public: void rotate(vector<vector<int>>& matrix) { int n=matrix.size(); if(n==0) return; for(int i=0;i...原创 2019-08-18 10:49:57 · 97 阅读 · 0 评论 -
反转链表
方法一:三指针法每次记录当前遍历指针cur,前一个指针pre,和下一个指针nextclass Solution {public: ListNode* reverseList(ListNode* head) { ListNode* pre=NULL; ListNode* cur=head; while(cur){ ...原创 2019-08-17 13:36:41 · 86 阅读 · 0 评论 -
LeetCode 234. 回文链表
请判断一个链表是否为回文链表。class Solution {public: bool isPalindrome(ListNode* head) { if(!head) return true; //利用快慢指针找出链表的中点 ListNode* fast=head; ListNode* slow...原创 2019-08-17 12:51:25 · 99 阅读 · 0 评论 -
LeetCode 141.链表判环, LeetCode 142.并找出环的入口
判环利用快慢指针,若快指针遍历完链表之前快慢指针没有相遇的话,则说明链表中有环。代码:/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * };...原创 2019-08-17 00:24:04 · 335 阅读 · 0 评论 -
LeetCode.83 删除排序链表中的重复元素(保留一个数字)
借助一个虚拟头结点,每次保存重复结点的最后一个结点。/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solutio...原创 2019-08-16 18:52:22 · 90 阅读 · 0 评论 -
LeetCode 86 分隔链表
思路就是为小于k的结点链表设置一个表头,并用pcur记录新链的最后一个结点,当遍历到小于k的结点时,将pcur指向当前节点,更新pcur。用pre记录上一个大于等于k的结点(注意pre的next要设为空),当遍历到大于等于k的结点时,将pre指向当前节点,更新pre。最后将pcur指向fnode(fnode记录的是第一个大于等于k的结点)。代码:/** * Definition for s...原创 2019-08-16 09:58:46 · 84 阅读 · 0 评论 -
LeetCode 946. 验证栈序列
数组里的元素是不重复的。思路是模拟入栈和出栈的操作,代码如下:class Solution {public: bool validateStackSequences(vector<int>& pushed, vector<int>& popped) { stack<int>s; int j=0; //...原创 2019-08-20 16:01:26 · 95 阅读 · 0 评论 -
LeetCode 417. 太平洋大西洋水流问题
设置两个数组,记录当前节点是否能够能流向太平洋和大西洋,从边界开始扩展, 能够扩展到的结点表示该节点能够流向太平洋或者大西洋,最后两个数组标志都1的坐标结点即为正确答案。class Solution {public: int tp[155][155]; int dx[155][155]; int dir[4][2]={{1,0},{-1,0},{0,1},{0,...原创 2019-07-07 00:57:56 · 214 阅读 · 0 评论 -
LeetCode 260. 只出现一次的数字 III
思路, 先全部异或一次, 得到的结果, 考察其的某个非0位(比如最高非0位), 那么只出现一次的两个数中, 在这个位上一个为0, 一个为1, 由此可以将数组中的元素分成两部分,重新遍历, 求两个异或值。代码:class Solution {public: vector<int> singleNumber(vector<int>& nums) { ...原创 2019-06-25 00:37:57 · 124 阅读 · 0 评论 -
LeetCode 190. 颠倒二进制位
class Solution {public: uint32_t reverseBits(uint32_t n) { uint32_t ans=0; for(int i=0;i<32;i++){ ans=ans|((n&1)<<(31-i)); n=n>>1...原创 2019-06-24 23:42:08 · 80 阅读 · 0 评论 -
LeetCode 95. 不同的二叉搜索树 II
思路:递归构造,选取当前序列的根节点,然后递给构造以该根节点的左子树集合和右子树集合,因为序列是递增的,所以根节点左边的子树一定比根节点小,右子树一定比右子树大。递归出口是end>begin,返回NULL。参考的题解代码:/** * Definition for a binary tree node. * struct TreeNode { * int val; * ...原创 2019-06-22 12:52:47 · 207 阅读 · 0 评论 -
LeetCode756. 金字塔转换矩阵
思路分析:首先我们需要知道每构造一次,bottom的长度减一,当bottom的长度 == 1时说明构造成功了。而每次构造都是按顺序取出bottom中的两个字母,确定第三个字母(‘A’到‘G’一共7种可能),这时我们再去判断当前三元组是否在规则中,如果在规则中我们就继续构造。当我们把bottom构造得到下一层nextStr,再使用nextStr构造下一层…直到bottom的大小 == 1。总结:这...转载 2019-06-17 15:43:13 · 264 阅读 · 0 评论 -
LeetCode638. 大礼包(DFS)
利用DFS进行枚举,每次dfs时,判断当前needs能否使用某个大礼包来替换,若能,就更新needs数组,进行下一次dfs,直到没有可以替换的大礼包为止。代码是抄的题解的:class Solution {public: bool valid(vector<int> &special_single, vector<int> &needs){ ...原创 2019-06-17 13:55:47 · 325 阅读 · 0 评论 -
LeetCode 473. 火柴拼正方形(DFS)
①将数组升序排序,贪心选择长的构建边,这样每次构建边的时候不用考虑有多种情况。②只需要构建三条边即可,因为之前已经对变长进行了判定。抄的别人的代码:class Solution {public: bool dfs(vector<int> &nums,int curLen) { if(curLen==0) return t...原创 2019-06-17 13:17:46 · 377 阅读 · 0 评论 -
LeetCode851. 喧闹和富有(DFS+记忆化搜索)
这题的意思是从每个节点出发,进行dfs,然后找出连通的结点中quiet值最小的那个点,这题采用记忆化搜索,对于每次dfs,返回当前节点及之后节点中quiet值最小的那个节点的编号。若已经访问过,则直接返回ans中的值。代码:class Solution {public: int g[505][505]; int vis[505]; int dfs(vecto...原创 2019-06-19 19:30:35 · 329 阅读 · 0 评论 -
LeetCode802. 找到最终的安全状态(DFS+记忆化搜索)
本题大意就是找出所有不与环连通的结点。不安全状态有两种情况:1、这个点在一个环中。2、这个点顺着边递推,会走到一个环里。所以本题的思路是给点设置三种状态,初始时的0表示未访问过的点;1表示这个点是不安全的,即这个点连接着一个环或就在环中;2表示这个点是安全的,不与任何环连通。然后对每个点进行深度优先搜索,若遇到了不安全的点,那么这个点也是不安全的,置为2。若遇到了安全的点,则表示已经有了一条可以...转载 2019-06-19 18:33:55 · 256 阅读 · 0 评论 -
LeetCode847. 访问所有节点的最短路径
这题跟普通的bfs不一样,因为节点可以重复访问,所以就不能用一个一维的数组来标识节点是否访问,这道题比较巧妙的就是利用二进制的来表示某个节点的当前状态。或表示前一个状态已经访问过的1加上访问当前节点所对应的1,举个例子,若在f及之前已经访问了0,1节点,即表示的状态为0011,若v是3号节点(1000),则或的结果为1011(即访问v后已经访问了0,1,3号节点)。这样通过判断某个节点的状态是...原创 2019-06-18 23:10:14 · 813 阅读 · 0 评论 -
LeetCode 773 滑动谜题(BFS)
这道题跟一般的BFS求最短路径不太一样,因为每一个状态是一个矩阵,而不是由一个元素的值或者两个元素的值决定的。所以这道题的做法是将这个2*3的状态转化为字符串。通过定位字符串中‘0’的位置,然后实行上下左右移动的操作。其他的就和普通的BFS模板题一样了。代码如下:class Solution {public: int slidingPuzzle(vector<vector<...原创 2019-06-18 21:55:56 · 868 阅读 · 0 评论 -
LeetCode 310. 最小高度树(求树的直径或者拓扑排序)
最开始我是利用的暴力解法,对每个节点进行bfs,求得树的最大高度,然后取最大高度的最小值,然后果不其然超时了。后来看了别人的博客,发现有两种思路:一、利用树的直径这道题求解的实际上是树直径中间的那一个节点或两个结点,若直径为奇数个结点,则根节点为最中间的那个结点;若为偶数个结点,则为最中间的那两个结点(具体怎么证明我也不清楚。。。)代码:class Solution {public: ...原创 2019-06-13 22:21:27 · 316 阅读 · 0 评论 -
LeetCode 96. 不同的二叉搜索树(动态规划)
一个长度为n的序列组成的二叉搜索树总数等于以每个数字为根节点形成的搜索树的集合之和,而对于每个数字为根节点所形成的搜索树之和=左子树形成的集合个数*右子树形成的集合个数。而对于右子树形成的集合个数,若右子树序列长度为len,则就等于1到len形成的搜索树集合的个数,因为序列是递增。(举个例子,即1到5与6到10形成的搜索树个数相当)。所以g[n]为长度为n的序列形成的搜索树个数。代码如下:cl...原创 2019-06-22 13:17:22 · 150 阅读 · 0 评论 -
LeetCode 144. 二叉树的前序遍历与中序遍历(非递归)
前序遍历:class Solution {public: vector<int> preorderTraversal(TreeNode* root) { stack<TreeNode*>s; vector<int>ans; while(!s.empty()||root!=NULL){ //栈为空且ro...原创 2019-06-22 13:45:13 · 150 阅读 · 0 评论 -
LeetCode 105. 从前序与中序遍历序列构造二叉树(已知前序(先序)与中序输出后序)
已知前序(先序)与中序输出后序:前序:1, 2, 3, 4, 5, 6(根左右)中序:3, 2, 4, 1, 6, 5(左根右)分析:因为前序(根左右)最先出现的总是根结点,所以令root为前序中当前的根结点下标(并且同时把一棵树分为左子树和右子树)。start为当前需要打印的子树在中序中的最左边的下标,end为当前需要打印的子树在中序中最右边的下标。递归打印这棵树的后序,递归出口为star...原创 2019-06-22 14:04:46 · 231 阅读 · 0 评论 -
LeetCode 187. 重复的DNA序列
因为只有四种核苷酸,所以用0,1,2,3分别表示四种核苷酸,那么每个核苷酸就可以用一个2位的二进制表示,所以我们可以将一个10个子母长的序列转化为一个20位的二进制序列。然后通过滑动窗口的方式扫描整个串。代码:class Solution {public: vector<string> findRepeatedDnaSequences(string s) { ...原创 2019-06-24 22:39:08 · 267 阅读 · 0 评论 -
LeetCode 137. 只出现一次的数字 II
将每个数想象成32位的二进制,对于每一位的二进制的1和0累加起来必然是3N或者3N+1, 为3N代表目标值在这一位没贡献,3N+1代表目标值在这一位有贡献(=1),然后将所有有贡献的位|起来就是结果。这样做的好处是如果题目改成K个一样,只需要把代码改成cnt%k,很通用。代码:class Solution { public int singleNumber(int[] nums) {...原创 2019-06-24 22:12:42 · 109 阅读 · 0 评论 -
LeetCode 39. 组合总和(回溯) +LeetCode 40. 组合总和 II(回溯)+216. 组合总和 III(回溯)+377. 组合总和 Ⅳ(dp)
普通的dfs回溯:class Solution {public: vector< vector<int> > ans; void dfs(vector<int>& candidates,int target,vector<int> tmp,int idx){ if(target<0) ...原创 2019-07-02 17:14:37 · 185 阅读 · 0 评论 -
LeetCode 368. 最大整除子集
这道题和找最长子序列有点像排序动态规划找到最长的整除子集,但是要记录前一个数位置举个例子 [1,2,3]我们用dp[i]记录到i最长的整除子集长度,用pre[i]记录到i前面一个数的位置class Solution {public: int dp[1000]; int pre[1000]; int maxi=0; int maxlen=1; v...原创 2019-07-02 15:27:18 · 194 阅读 · 0 评论