摘要:
思路: 要弄清楚题目的意思,返回大小在[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 阅读全文