LeetCode
高木同学丶
此人不懒,但是他什么都不想写
展开
-
Leetcode刷题笔记——剑指 Offer 34. 二叉树中和为某一值的路径【DFS】
题目思路显然这是一道DFS+回溯题,在DFS中加回溯需要在递归函数中维护一个外部变量,该变量用于记录递归信息,对该变量的回溯一般放在DFS函数的尾部,在到达递归的最深处开始回溯外部变量。DFS与回溯代码模板:type function(){vector<vector<int>> res; //用于记录结果vector<int> path; // 用于记录递归信息if(正常运行的条件){ dfs(一般传入数、vector等,传入记录递归的变量,传入记录结果原创 2022-03-01 20:59:57 · 242 阅读 · 0 评论 -
Leetcode刷题笔记——剑指 Offer 47. 礼物的最大价值【DP】
题目思路明显的DP题,记忆化搜索。采用贪心会陷入局部最优。我们需要采用一个二维数组dp[i][j]用于保存i,j这个位置的礼物最大价值,那么对于位置m,n而言,到达它的位置的礼物最大价值要么是从m-1,n过来的,要么是从m,n-1过来的。只需要比较这两个位置的礼物的最大价值,选择较大的那个位置,再加上当前m,n这个位置的礼物价值,就是状态转移方程。dp[i][j]=max{dp[i-1][j],d[i][j-1]}+grid[i][j].其边界条件为左边第一列与上面第一行,因为走到左下角和右上原创 2022-02-24 16:55:12 · 291 阅读 · 0 评论 -
Leetcode刷题笔记——7.整数反转
题目思路反转不难,不停对10取余再除10就行,本题的难点在于反转后超过32位整数的范围如何处理。在C++中如果一个int类型的数超过32位就要用long或long long来保存,如果int超过32位,在对它进行强制类型转换的时候,该数就不会是原来的数值,利用这点进行判断,如果将long类型强制类型转换后不等于原来的int数,说明转换后超出范围,直接返回0代码class Solution {public: int reverse(int x) { long n=0;原创 2022-02-18 17:38:13 · 380 阅读 · 0 评论 -
Leetcode刷题笔记——1995. 统计特殊四元组【哈希表的应用】
题目思路a+b+c=d可以转化为a+b=d-c,且a<b<c<d,那么可以将数组分为两部分,右边部分为cd,左边部分为ab。取一条分界线,该分界线位于右侧倒数第二个元素前,即意味着此时cd都只有一个选择,固定c为分界线的后一个元素,则d在c+1~n之间遍历,b在c-1~1之间遍历,a在1~b之间遍历。用哈希表存下nums[d]-nums[c]出现的次数,随后在左侧遍历时统计nums[a]+nums[b]出现的次数,将此次数累加即可得到结果代码class Solution {原创 2021-12-29 20:25:52 · 313 阅读 · 0 评论 -
Leetcode刷题笔记——904. 水果成篮【哈希表、滑动窗口】
题目思路理解完题目即可发现,这题的本质是要求数组中的最长连续子数组长度,不同的是这个连续子数组可以拥有两个不同的元素。由于存在不同的元素,首先可以想到用哈希表记录子数组不同元素的出现次数,该哈希表的长度应该不超过2,一旦超过2说明出现了第3种元素,需要将之前出现的2种元素中的任意一种剔除出去,这种右侧向右扩展,出现意外需要左侧运动的思路很容易想到滑动窗口。滑动窗口模板代码:int left=0;int len=0,res=0;for(int i=0;i<nums.size();i++){原创 2021-12-21 20:16:54 · 326 阅读 · 0 评论 -
Leetcode刷题笔记——506. 相对名次【hashmap】
题目思路本题实质上就是考排序,不过是排好序之后要所有元素记得原来的位置。那么只要排好序之后用hashmap存下当前排好序的元素与排序的联系即可(即用hashmap建立元素与排名之间的联系)复制一下score数组,对原数组进行排序,排好序后用hashmap记录元素与排序之间的关系,再根据原数组的元素找到hashmap对应的排名,即可。hashmapunordered_map<int, string> order; %此hashmap为int元素与string元素之间的映射关系代码原创 2021-12-02 21:21:46 · 345 阅读 · 0 评论 -
Leetcode刷题笔记——384. 打乱数组【洗牌算法】
题目思路对于构造函数以及reset函数比较简单,可以用一个类的私有变量保存下Nums(在构造函数中保存),每次调用reset()时将这个私有变量再赋值出去。对于shuffle(),要求等概率返回某个方案,或者说每个元素都等概率出现在每个位置中。可以使用Knuth 洗牌算法 ,在O(n)的复杂度内等概率地返回某个方案。简单地说就是将数组分为两部分,一部分是完成随机的,一部分是原始数组。循环选择i,从[i,size()-1]中随机选择一个数与nums[i]交换,此时nums[i]就归属于完成随机的部原创 2021-11-22 19:32:02 · 676 阅读 · 0 评论 -
Leetcode刷题笔记——120. 三角形最小路径和【DP】
题目思路显然,第i层的最小路径中必定也是第i-1层的最短路径,即这个大问题可以有各个小问题合并求解,采用DP。DP三个步骤:列出状态转移方程,确定边界,确定计算顺序。状态转移方程:使用** dp[i][j] **表示到达矩阵的第i行第j列的最小路径和。正常情况下:(i,j)这个位置只能由上层的j列或j-1列到达,所以dp[i][j] = min{dp[i-1][j-1], dp[i-1][j]} + nums[i][j]特殊位置:处于最左侧的位置只能顺着最左侧下来:dp[i][0] =原创 2021-10-01 19:49:41 · 155 阅读 · 0 评论 -
Leetcode刷题笔记——994. 腐烂的橘子【BFS】
题目分析很容易想到BFS,按层腐烂好橘子。注意第一步应该将所有的坏橘子入队,每次遍历一层,遍历一层res+1。需要找到所有的坏橘子,需要在开始时遍历整个矩阵,同时记录好橘子的个数cnt,每腐烂一个好橘子cnt–,最后看cnt是否为0,若不为0说明有好橘子未被腐烂,返回-1;特殊情况,根本没有坏橘子,分两种情况,一种没有坏橘子也没有好橘子即矩阵为全0矩阵,这种情况在第0分钟就没有好橘子了;第二种情况没有坏橘子但是有好橘子,会出现队列为空,但是cnt不为0的情况,这种情况返回-1,与正常流程合并。r原创 2021-09-28 20:21:10 · 177 阅读 · 0 评论 -
Leetcode刷题笔记——617. 合并二叉树【DFS】
题目分析显然这是一道搜索算法题,本题若采用BFS需要考虑很多种情况,而采用DFS则代码比较简洁易懂。首先DFS采用递归,函数传入两个节点,优先考虑出递归的条件:若两个根节点都是空节点则直接返回空节点若两个节点中有一个节点是空节点则直接返回另一个非空节点出递归条件考虑完,开始走一遍正常流程:两个节点都非空,则new一个节点,该节点的val由这两个非空节点的val相加得到,该节点的左孩子由这两个非空节点的两个左孩子决定,右孩子同理。完成val left right之后返回创建的这个节点。代码原创 2021-09-27 21:43:29 · 115 阅读 · 0 评论 -
Leetcode刷题笔记——剑指 Offer 32 - III. 从上到下打印二叉树 III
题目分析典型的层次遍历题目层次遍历代码模板:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public: vect原创 2021-09-25 12:10:31 · 139 阅读 · 0 评论 -
Leetcode刷题笔记——725. 分隔链表
题目分析很容易就想到利用链表长度n先除以k得到每一个子链表的最短长度,再n对k取余得到前几个链表的长度应该加1。实际构造过程中,逻辑稍微有点混乱。小技巧是首先令specialList = n%k; 这代表了前specialList个子链表应该加1个节点。利用for循环给每一个子链表添加length=n/k个节点之后,判断specialList的值若大于0则在尾部添加一个节点,添加之后specialLsit–,之后将该子链表最后一个节点的next置为nullptr。得到链表长度后只需要对原链表遍历一原创 2021-09-23 18:09:40 · 150 阅读 · 0 评论 -
leetcode刷题笔记——733图像渲染
题目思路首先想到广度优先搜索(BFS)与深度优先搜索(DFS),要背下BFS与DFS,往上面套就行。BFS与队列相匹配,DFS与栈相匹配。BFS模板:queue<int> Q;int visited[N + 1] = { 0, };Q.emplace(第一个元素);while(!Q.empty()){ int x = Q.front(); Q.pop(); //在此处添加出队列后的操作 visited[x] = 1; // for(int i...与当前元素相关的入原创 2021-09-23 18:00:01 · 188 阅读 · 0 评论 -
Leetcode刷题笔记——剑指 Offer 35. 复杂链表的复制
题目分析本题要求我们对一个特殊的链表进行深拷贝。如果是普通链表,我们可以直接按照遍历的顺序创建链表节点。而本题中因为随机指针的存在,当我们拷贝节点时,「当前节点的随机指针指向的节点」可能还没创建,因此我们需要变换思路。一个可行方案是,我们利用回溯的方式,让每个节点的拷贝操作相互独立。对于当前节点,我们首先要进行拷贝,然后我们进行「当前节点的后继节点」和「当前节点的随机指针指向的节点」拷贝,拷贝完成后将创建的新节点的指针返回,即可完成当前节点的两指针的赋值。即本题难点在于该随机指针在深拷贝时其内容尚未原创 2021-09-22 16:45:26 · 212 阅读 · 0 评论 -
leetcode刷题笔记——剑指 Offer 30. 包含min函数的栈
题目采用两个栈,一个数据栈一个最小值栈,数据栈正常进行栈操作,最小值栈用来保存当前数据栈中的最小值,每push一个值最小值栈就更新一次。例如将 2 1 3 4 5 6入栈,最小值栈则为 2 1 1 1 1 1 。因为实现min功能对当前数据栈中的其他数完全不感兴趣,只需要保存当前的最小值就行。注意栈的相关操作:stack<int> s;stack(const stack&); //复制构造函数 stack<int> s2(s1);s.push(1);in原创 2021-09-20 20:08:49 · 95 阅读 · 0 评论 -
leetcode刷题笔记——470.rand7()实现rand10()
题目:思路:要求rand10()输出均匀分布并不代表着每个输出的数概率为1/10。运行两次rand7(),第一次作为十位第二次作为个位,比如第一次取得6,第二次取得3,则(63)为一次组合,这个组合为7进制数。将此数转化为十进制数,公式为7*(6-1)+3=38。即运行两次rand7()可以得到的十进制数应该为7*(rand7()-1)+rand7()。我们令res=7*(rand7()-1)+rand7(),显然res∈[1,49]。因为两次运行rand7()独立,所以res取得[1,49]内原创 2021-09-05 20:57:27 · 97 阅读 · 1 评论 -
leetcode刷题笔记——5.最长回文子串
题目:思路:整个问题可以分解为小问题,一个字符串为回文串则其首尾必定相等,除首尾之外也是回文串。这种大问题分解为小问题,首先想到动态规划。接下来是动态规划的步骤,列出状态转移方程,确定计算顺序。这个问题中,很容易就可以想出状态转移方程为:其边界条件为:代码:class Solution {public: string longestPalindrome(string s) { int n=s.size(); if(n<2){原创 2021-07-22 22:31:37 · 119 阅读 · 0 评论 -
leetcode刷题笔记——664. 奇怪的打印机
题目:思路:整个问题可以分解为小问题,比如abcacb这个字符串就可以表示为abca+cb,其次数也满足相加。这种大问题分解为小问题,首先想到动态规划。接下来是动态规划的步骤,列出状态转移方程,确定计算顺序。这个问题中,令f[i][j]表示字符串s的第i位到第j位需要打印的次数,那么可以想到如果首尾两个字符相同,其次数与去掉尾部字符的字符串打印次数一致,即S[i]=S[j]则f[i][j]=f[i][j-1]。如果首尾不一致,则需要分别完成区间左右两部分的打印,记两部分为 [i,k][i,k] 和原创 2021-05-24 16:15:10 · 103 阅读 · 0 评论 -
leetcode刷题笔记——421. 数组中两个数的最大异或值
题目:思路:采用字典树,所谓字典树见下图从高位保存数字,将数字的二进制形式的最高位保存至树的最高层。这样我们可以根据异或的性质,只有两个不同的值才能得1,也就是说,当要获取树中与0010异或结果最大的数,优先考虑的是1101,每一位都不同,此处采用贪心思想。如果树中不存在与某位相反的值,则取相同值。采用字典树的好处是,仅需要log(n)就可以得到能够取得最大异或值的数。字典树的数据结构:struct Trie{ Trie* left = nullptr; //字典树左指原创 2021-05-23 11:38:28 · 150 阅读 · 0 评论 -
leetcode刷题笔记——1734、解码异或后的排列
题目:思路:假设原数组perm=[a,b,c,d,e],n=5;异或后编码数组encoded=[A,B,C,D]。那么A=a^b B=b^c C=c^d D=d^e。又因为perm是由前n个正整数构成的随机顺序的数组,则perm的全部元素异或结果是已知的,x=1^ 2 ^ 3 ^ 4 ^5 = perm[0]^ perm[1] ^ perm[2] ^ perm[3] ^perm[4].其中perm[1] ^ perm[2]=B=encoded[1],perm[3] ^ perm[4]=D=en原创 2021-05-22 17:06:14 · 105 阅读 · 0 评论