随笔分类 - leetcode
摘要:思路: 要弄清楚题目的意思,返回大小在[low,high]的数的大小的和,不是树里在这个范围里面的节点的和。 那么就是树的遍历 DFS,BFS两种完成。 因为是二叉搜索树,我们有如下几种情况: 遍历到了空节点,返回0. 该节点大于high,那么就进入该节点的左子树找更小的数。 该节点小于low,那么
阅读全文
摘要:思路: 之前做过用栈模拟队列的题,通过两个栈一个先暂存数据,判断另一个栈是否为空,不为空就暂时不添加,如果为空就从暂存的栈将元素放入该栈。 这里用队列模拟栈也是类似的,也需要两个队列来做,一个用来辅助。不过这里是栈,后加的先出,所以我们每添加一个元素,就要把用来当作栈的队列的所有元素放入另一个暂存的
阅读全文
摘要:思路: 这道题看到的时候没想到用二分法,主要问题在,关注的是如何从weight数组找结果,而不是从 全部搬完的天数 入手。 我们可以知道,要能把所有物品搬走,要花最长时间的每日搬运重量应该用的是 weights数组中 质量最大的元素,因为这样刚好确保了所有的物品都能搬走,并且花时间最长。 那么最短时
阅读全文
摘要:思路: 直接二分查找即可。 代码: class Solution { public: int searchInsert(vector<int>& nums, int target) { int n = nums.size(); int left=0,right=n-1; int res=n; whi
阅读全文
摘要:思路: 题目中描述公共祖先定义为,p,q的共同且深度最深的祖先。就是最靠近p,q的祖先节点。 那么我们应该判断每个节点的子树是否有p,q,如果一个节点都有p,q那么这个点就是公共祖先。而且我们从底向上遍历,能得到的最深的深度了。 我们 通过这个条件 (left_son&&right_son) ||
阅读全文
摘要:思路: 因为是二叉搜索树,那么就是在中序遍历的基础上进行额外的处理即可 那么就有递归和迭代两种方法。 首先递归有原地算法和非原地算法两种。 原地算法需要有一个头节点,我们从root右子树开始处理,那边处理完,头节点就能在树的开头了。 每当一个结点的right指向前一个结点后,pre就要定位在该节点上
阅读全文
摘要:思路: 一开始以为求最大深度,求下去提交发现错误。 求的是直径,意思是找到最长的一串连接的节点。但和最最大深度的方法类似,我们任然需要求出左右子树的深度,只是多了一个变量res用来存储直径长度。 对于每一个节点的最大深度,我们会求他的左右子树的深度,然后左右子树相加和res变量比较,如果大就更新re
阅读全文
摘要:思路: 对于一棵树,可以看成许多小树组成,每棵小树都有自己的root,我们从这里入手。 对于每棵小树我们都需要定位其root,对于preorder,第一个元素就是root,但inorder还需要查找,但如果每次都遍历搜索的话就会消耗很多时间,所以我们先把inorder的元素放入hash_map,元素
阅读全文
摘要:思路: 类似完全背包问题,但是背包问题求的是组合,这里求的是排列。区别为,例如{1,3},组合只有{1,3},而排列有{1,3}和{3,1}. 而组合和排列的转换可通过两个for循环,如果背包容量的for在外,物品的for在里,那么就可以得到排列。相反就得到组合的排列。 在这道题,0-target就
阅读全文
摘要:思路: 这一题比较容易想到BFS,如果我们从左到右的向队列加入节点,那么最后一个加入的节点就是我们能看到节点,那么就遍历到这层最后一个取出节点的时候就把他加入进res数组。也可以从右到左,把第一个添加进队列里面的节点放入res数组。 代码: /** * Definition for a binary
阅读全文
摘要:基础训练: 递归: 1. /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(
阅读全文
摘要:思路: 通过把二维矩阵转化为一维来求解,我们的一维并不是对矩阵处理,一维数组是一列的元素和。 首先我们定义上边界,上边界从第一行开始,然后创建一个数组,每一个上边界创建一次数组,然后再定义一个下边界,从上边界的位置开始。然后求解上下边界组成的矩阵中第0列到最后一列的每一列和。 因为矩阵还需要有左右边
阅读全文
摘要:思路: 这种每个问题元素有多个解的问题还是用动态规划。 那么我们从最后开始想,如果但用最后一个字符,那么就要保证他不为0即可。那么i位置的解码方案就应该加上前一个位置的解码方案。第一次对i位置的加,dpi是等于0的,所以此时dpi=dpi-1,转移方程就为 dpi=dpi-1; 如果用最后两个字符,
阅读全文
摘要:基础练习: 递归: /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nul
阅读全文
摘要:思路: 和昨天的每日一题相似,同样使用快慢指针,区别在于我们比较快指针所指的元素是否等于val,如果不等那么就将其放到慢指针所指的地方。最后return slow即可。 代码: class Solution { public: int removeElement(vector<int>& nums,
阅读全文
摘要:思路: hash表来做,只要res字符串的长度还小于s的长度就一直循环,循环的做的事情是先从小字母加,再从大的字母加。 我们通过vector来模拟hash表,从小到大的加就是从i=0开始加到i=25,从大到小就是25到0的加即可。 代码: class Solution { public: strin
阅读全文
摘要:思路: 直接双指针即可,也称快慢指针吧。 慢指针用来定位应该被替换的元素,也就是数组前几个元素,快指针用于发现和慢指针所指的元素不同的元素,当发现后就替换掉慢指针所指的元素即可。 代码: class Solution { public: int removeDuplicates(vector<int
阅读全文
摘要:思路: 因为固定了是在 [i-k,i+k]的区间内寻找 在区间[nums[i]-t,nums[i]+t]的元素,所以可以考虑用滑动窗口,但是这里并不用双指针来操作,不然和暴力没区别了。 我们要找到一个数据结构,能够自动排序,因为排序我们就能直接找到K窗口里面的最小值和最大值,优化找到[nums[i]
阅读全文
摘要:dbq,不会,理解不了题解。 题解 class Solution { public: bool isScramble(string s1, string s2) { if(s1.length()!=s2.length()) return false; int n=s1.length(); vecto
阅读全文
摘要:思路: 直接进行同步的DFS比较即可,首先要确定什么条件返回true,什么时候返回false 返回true即遍历到叶子节点,返回false则是某个节点值不相同,包括val不同和结构不同(即分支数和分支方向不同) 代码: /** * Definition for a binary tree node.
阅读全文

浙公网安备 33010602011771号