- 博客(49)
- 收藏
- 关注
转载 leetcode 494目标和
在深度优先搜索专题看到了这道题,个人感觉有动态规划是最正统的方法。但是为了训练递归能力,还是用dfs做吧。看了一份题解才发现,这是一道典型的搜索和回溯结合的问题。一定要记住其中的细节,即搜索完以后要回溯!!!class Solution {public: int ret=0; void dfs(vector<int>& nums,int S,int pos...
2018-10-22 07:54:29 342
原创 leetcode 662二叉树最大宽度
一开始的思路是用bfs,但是感觉处理起来比较麻烦,后续会更新bfs的方法,这里先贴上dfs的方法。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) ...
2018-10-21 21:11:28 539
原创 leetcode 654最大二叉树
//该题思路非常明确,需要注意的是(1)既分配指针又申请节点内存这一操作 TreeNode* root=new TreeNode(0);(2) 对于这种left和right的边界判断 if(right<0||left>size) return NULL; if(left>right) return NULL if(left=...
2018-10-21 16:24:35 292
原创 sigmoid和ReLU的优劣
激活函数的作用:为了增加神经网络模型的非线性。Relu优点:(1)relu函数在大于0的部分梯度为常数,所以不会产生梯度弥散现象.。而对于sigmod函数,在正负饱和区的梯度都接近于0,可能会导致梯度消失现象。(2)Relu函数的导数计算更快,所以使用梯度下降时比Sigmod收敛起来要快很多。Relu缺点:Relu死亡问题。当 x 是小于 0 的时候,那么从此所以流过这个神经元的梯度将...
2018-10-03 18:43:51 9162
原创 二维数组中的查找---剑指offer
一开始的思路,因为矩阵中的元素向右或者向右是递增的,考虑将二维数组压缩成一个一维数组,然后二分查找。但是仔细分析,发现这样不是很靠谱,因为可以写个例子看看,从第一行开始从左向右,从上到下地将元素压入一维数组中,并不是严格的单调递增,所以不适合用二分查找。 看了牛友们的思路后,发现了非常秒的方法。即从左下角开始,与待查元素进行比较,如果比矩阵中的元素小,则向上移动;如果比矩阵...
2018-09-17 19:28:32 165
转载 不用加减乘除做加法----剑指offer
https://www.jianshu.com/p/55166bfd31dd 感觉这道题的数学成分比较浓厚,参考这篇帖子。(1)首先做加法,不考虑进位问题。相当于做异或操作。(2)然后只考虑进位,不考虑加法问题。相当于做与运算。对第二步的结果左移一位。重复上述的两个过程,直到进位为0。while( num2!=0 ){ int sum = num1 ^ num...
2018-09-15 14:26:20 161
原创 栈的压入,弹出序列-----剑指offer
一开始整理的思路,根据样例,可以看出。 合理的情况应该是:当弹出序列为纯增,或者先增后减,则可能是出栈序列。但是,仔细观察,可以发现,该思路有种前提,即压栈的数字是递增的,否则,将不可以。上面的思路走不通时,看了大佬们的思路。即利用一个栈,模拟这个压栈和出栈的整个过程。链接:https://www.nowcoder.com/questionTerminal/d77d11405cc7470d...
2018-09-15 09:37:12 147
原创 包含min函数的栈---剑指offer
下面的两种方法是一开始自己写的,以及看的别人的。别人的思路是利用两个栈,我一想,人家让你构造栈,你用栈,是不是不太靠谱啊。于是,我在别人用两个栈的基础上,改用两个vector,感觉比较对。好了,好了,上代码。class Solution {public: vector<int> v; vector<int> minv; void push(in...
2018-09-15 09:04:11 169
原创 338. 比特位计数
首先要掌握一个基本操作,即如何求一个整数中1的个数。网上一般有多种操作,我比较喜欢“位移”的方法。while (temp>0){if ( (temp & 1) == 1 ){//temp & 1如果re最低位是1,则结果等于1 //计数器加一 }temp = temp >> 1;//向右移位}注意,上面的操作是针对待求数是非...
2018-09-14 17:42:08 106
原创 198. 打家劫舍
很明显是dp问题。用一个一维数组表示dp数组,状态转移方程为:resmax[index] = max(nums[index] + resmax[index-2], resmax[index-1]); 其中resmax保存,遍历到该节点时的,最大值。注意,遍历到该节点,但该节点不一定选。另外该题的初始解要想清楚。即resmax[0]=nums[0];但是resmax[1]不等于nums[1...
2018-09-14 17:29:23 140
原创 303. 区域和检索 - 数组不可变
该题的分类是动态规划问题,我其实没看懂它为什么要这么分。。。。该题需要借助一个知识点:即数组的前缀和,它有一个性质即:a[i]+a[i+1]+…+a[j]=sum[j]-sum[i-1]即数组从第i项到第j项的和,等于数组从第一项开始累次加和的sum[j],减去从第一项开始累次加和的sum[i-1]项。代码如下:class NumArray {public: vector&l...
2018-09-14 16:41:47 216
转载 606. 根据二叉树创建字符串
这题的关键是看懂题意。特么也不提醒一下,要靠自己抽象吗???https://blog.csdn.net/obrcnh/article/details/77996276 参考了这篇博文,博主看出了规律。B站大佬更是牛批,上来直接做。。。。规律如下:(1)当某个节点左右两个子节点均不为空时,应加上(),并在其中加上子节点的值;而当某个节点只存在左子节点时,则可以省略右子节点对应的()。...
2018-09-10 20:39:47 239
原创 349. 两个数组的交集(1,2)以及2的follow up
第一个:应该想到stl集合(set) :天然去重,满足题意。第二个:我想到用两个map,然后分别定义两个map的迭代器,进行双重for循环的扫描来做。详情见代码。(一遍ac)class Solution {public: vector<int> intersect(vector<int>& nums1, vector<int>&...
2018-09-09 16:05:27 193
原创 437. 路径总和 III
有种不错的方法符合我刚开始想使用数组的设想。见这篇博文:其中每次都将新遍历到的节点,都加到整个数组中,这样,当前数组中存储的每一个位置(i:从0到size-1)的值,代表的是----从该位置(i)出发,到达新遍历的这个节点的路径和。----其实有种动归的思想在里面。这个操作简直太妙了,另一个妙的地方,即数组设为传值调用,使得每次都能回到原来的状态,然后再从那个状态到那个状态的另一个子树去遍历,...
2018-09-07 11:40:09 247
原创 543. 二叉树的直径
一种比较好的思路是。随便找一个点(一般取根节点),找到这棵树中,距离这个点最远的点,再从找到的这个点开始,找到距离它最远的点。这种思路是带有很强烈的数学成分。证明可自行解决。 b站大佬是用动归来做的,我不是很好理解。 这里给出一种基础做法,即借助求二叉树的深度的方式。对于每一个节点,求其左右子树的最大深度,然后对于每一个子节点的左右深度加和,与一个统计树的直径的全局变量作...
2018-09-07 09:57:56 1143
原创 404. 左叶子之和
我是采用一个,参数中加入一个flag的技巧,自己AC的。如果是左孩子,则遍历时,flag置为1;否则如果是右孩子,flag置为2.class Solution {public: int ret; void dfs(TreeNode* root,int flag) { if(root==NULL) return; dfs(root->...
2018-09-07 09:11:40 135
原创 208. 实现 Trie (前缀树)
Trie(前缀树/字典树)及其应用字典树节点的定义和字符串的构造。代码如下:struct Node{ Node* nxt[26];//这里可以初始化为更多的子节点 int flag;//标记该到节点是不是一个单词 Node(){ //构造函数,初始化每个子节点为NULL,且该节点不表示一个单词,即flag=0 for(int i=0;...
2018-09-04 16:12:46 422
原创 53. 最大子序和
求连续子数组的最大和很简单,做过这个题。记得那个关键的点是,前面那个dp[i-1]如果是一个负数,则它对后面的 值就没有“贡献”,就不用加了。lass Solution {public: int maxSubArray(vector<int>& nums) { int size=nums.size(); int *dp=new ...
2018-09-04 14:37:09 106
原创 637. 二叉树的层平均值
这道题,为了训练递归能力,不用BFS做,但是发现csdn或者leetcode的discuss里很多都是用bfs做的,表示现在一看到队列就觉得low。。。。。。偶尔发现有递归版本,但是不是用带深度这一参数的方式实现的,所以我感觉不够纯粹。到这里,还是b站清华大佬六批,思路够纯粹,且适合初学者。这种技巧的核心是怎么能记录下来每一层的值的和是多少,其实可以联想“数组”可以通过对应下标处理对应的值,于...
2018-09-02 16:12:46 415 1
原创 669. 修剪二叉搜索树
一开始的思路是凭借一个pre指针,pre指针指向当前遍历节点的父节点,然后当发现该节点不符合要求时,利用二叉搜索树的性质,若该节点是小于左边界的,则它的左子树也势必不符合要求,此时将该节点的父节点指向该节点的右子树。当该节点的值大于r时同理。但是没成功,自己没想到这种方法的解决办法,感觉一个原因是因为根节点的父节点这个问题不好处理。但是这种带着父节点参数的问题以后还是要注意总结。class S...
2018-09-02 15:11:57 153
原创 226. Invert Binary Tree
这是一道给的背景介绍很六批的题---Google: 90% of our engineers use the software you wrote (Homebrew), but you can’t invert a binary tree on a whiteboard so f*** off.一开始我自己写了个swap函数,竟然通过不了。换成系统自带的swap函数竟然可以,why?????...
2018-09-01 20:28:07 80
转载 563. 二叉树的坡度
设置一个全局结果变量,不断更新每一个节点的左右子树的差的绝对值的情况。返回值的形式是考虑的重点。return l+r+root->val; class Solution {public: int ret; /*int sum(TreeNode* p) { if(p==NULL) return 0; if() }*/ ...
2018-09-01 19:41:27 216
转载 98. 验证二叉搜索树
(1)非递归的方法我能想出来,即中序遍历,只要前面的数大于等于后面的,则不是BST。(2)然鹅,我们最主要是为了训练递归的方法。下面介绍递归方法:https://blog.csdn.net/feliciafay/article/details/18400865这里采用了为每个节点传入最大最小值的技巧,该题用递归判断是否是二叉搜索树,必须用这个方法。该题还有一个问题即我用,b站视频的...
2018-09-01 15:29:47 82
原创 101. 对称二叉树
采用递归和迭代两种方法:(1)递归:在一开始做的时候,试图用二叉树的中序遍历来做。因为我发现对于对称的二叉树,中序遍历的结果也是对称的。所以以为,构建一个vector,然后中序遍历一遍,然后对这个vector,看是否对称,即可得到是否是对称二叉树。但是,运行时一个反例,让我明白这个简单粗暴的方法是不行的。比如下面这个例子,【1,2,3,3,null,2,null】这棵非对称二叉树的中序遍历...
2018-08-31 15:45:47 170
原创 117. 填充同一层的兄弟节点 II
这个题打算用来做DFS的练手的,但是用了下递归发现找不到很好的思路。看网上的答案也不是很明白。采用BFS做,一开始用last和nlast的方法,发现复杂度有点高,而且又碰到了该死的“空指针危险的”问题。搜了一下网上的答案,发现有一个BFS的思路非常不错,和传统BFS思路结合的不错。https://blog.csdn.net/guicaisa/article/details/482497...
2018-08-31 10:34:41 231
原创 109. 有序链表转换二叉搜索树
该题不同于108的一个难点是,链表无法采用下标访问的方式来获取元素。我的初始思路是,定义一个数组,将链表的值都push_back到vector里面,然后套用108的方法进行做。这样的话额外空间复杂度是O(n),比较费空间,且思路无亮点。在看过网上的一些思路后,发现牵扯一个链表常考的知识点,即快慢指针。这里快慢指针的一个用法是:可以通过快慢指针找到一个链表的中间节点。注意,快慢指针初始化时可...
2018-08-31 07:15:34 187
转载 108. 将有序数组转换为二叉搜索树
详见一个老外的的discuss。https://leetcode.com/problems/convert-sorted-array-to-binary-search-tree/discuss/162781/Simple-recursive-c++-solution.-O(n)-time-O(logn)-space.-With-description这道题考察的其实是二分查找的知识。二叉搜...
2018-08-24 11:13:27 141
原创 337. 打家劫舍 III
这其实是一个在“图”上选或者不选的问题。因为这是一棵二叉树,所以选或者不选主要是对当前节点及其左右子树进行判断。如果选当前节点,则意味着-------;如果不选当前节点,则意味着------。(用文字不容易说清楚,直接见代码即可)。class Solution {public: pair<int,int> dfs(TreeNode* root) { ...
2018-08-24 09:22:21 341
原创 114. 二叉树展开为链表
首先是原地算法的定义:算法原地工作的含义是指不需要任何额外的辅助,算法所需要的辅助空间不随着问题的规模而变化,是一个确定的值。通过观察示例可以知道,我们可以猜想,大方向是前序遍历。第一种思路:dfs。设置一个全局的指针(这种做法有点脱离原地算法,因为多开辟了一个指针变量)核心思想是拿到一个根节点以后,将其左右子树断开。然后将作为全局变量的右孩子指向刚断开左孩子和右孩子的根节点(flat...
2018-08-23 08:30:19 210
原创 542. 01 矩阵
这个题需要到时候再看一下,涉及好几点。(1)一个是问题的转化,把1到0的最短距离化成0到1的最短距离。(2)初始化工作,上来先求行数和列数,然后初始化结果矩阵。(3)pair<int,int>的使用。并且定义用pair初始化四个方向。(4)BFS的具体内部实现和细节。class Solution {public: vector<vector<...
2018-08-15 20:23:18 237
原创 690. Employee Importance
一开始写的很麻烦,是因为忘记了auto的使用,auto适合做这种数据结构比较复杂的题。使用auto一般要结合for迭代循环,即for(:)可以参考一篇博文 https://blog.csdn.net/u010141928/article/details/78671452该题的题意多少有些模糊,其实是求不仅是直接下属的所有员工的weight的和,还有直接下属的员工的直接下属的员工。cl...
2018-08-15 19:17:58 151
转载 116. 填充同一层的兄弟节点
https://www.cnblogs.com/ariel-dreamland/p/9165670.html 这篇文章给出了多种方法,不错。通过该题可以抽象出的核心问题是--------跨子树处理操作问题。 递归的思想还是需要训练: 递归方法中,下面这句是一个关键,它表征了该题的规律。if (root -> next) ...
2018-08-15 10:00:24 146
转载 129. 求根到叶子节点数字之和
有一篇讲得非常好的:https://blog.csdn.net/qq_26410101/article/details/80554845 先说一下一开始的错误,首先是在遇到叶子节点以后企图将temp clear调,这样是完全不对的;因为temp全局的,清空temp会让除了该叶子节点以外的前面的节点也清除掉。这样比如说访问完某个节点的左子树以后,再访问该节点的右子树时,根节点已经不在里...
2018-08-14 17:23:42 388
原创 110. 平衡二叉树
对于这种有单独操作(求树的高度)又夹杂另一操作(随时判断一棵树的左右子树的高度)的,且这一另一操作贯穿于整棵树始终的。要把这两种操作结合起来。class Solution {public: bool flag=true; int height(TreeNode* root) { if(root==NULL) { ...
2018-08-14 15:58:30 94
原创 491. 递增子序列
第一种方法是暴力枚举,需要能考虑到给定的集合大小是15以内,并且知道一个数学知识:即一个集合的子集个数是2^n,所以枚举的话最多是2^15方,还是可以运算的。知道了这个以后就需要知道如何用C/C++程序实现对一个给定集合的所有子集的查找。详情可以参考这篇文章,思考一下就能看懂。https://blog.csdn.net/yanerhao/article/details/77075462比如...
2018-08-08 16:09:03 594
原创 199. Binary Tree Right Side View
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; *///大...
2018-08-07 15:23:01 72
原创 257. Binary Tree Paths
先上代码:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; ...
2018-08-07 15:01:24 67
转载 python的多态
转自:廖雪峰的官方网站对于一个变量,我们只需要知道它是Animal类型,无需确切地知道它的子类型,就可以放心地调用run()方法,而具体调用的run()方法是作用在Animal、Dog、Cat还是Tortoise对象上,由运行时该对象的确切类型决定,这就是多态真正的威力:调用方只管调用,不管细节,而当我们新增一种Animal的子类时,只要确保run()方法编写正确,不用管原来的代码是如何调用的。这...
2018-04-05 11:58:34 100
原创 牛客网递归训练——魔术索引1
首先,一个知识点。二分查找:对于一个有序数组,比如1,2,3,4,5,6.要查找元素5,首先判断6/2=3,即元素3(下标从一开始),和5的大小关系,判断后,再从另一首歌开始。二分查找中递归的使用:是分别从左边和右边进行递归,进行二分查找
2017-03-06 17:11:12 190
原创 关于动态规划解题步骤和两个重要性质的理解---以最长递增子序列为例
首先要感谢自己幸运地看到了慕课网上,北大老师的程序设计与算法课。讲得真心不错,推荐一看。说明:该文章所直接使用的动态规划解题步骤来自上述的课程,不再具体讲解,直接使用。1:把原问题化为子问题。首先考虑的是----“求序列前i个元素的最长递增子序列”,即可以定义F(i)=x;x是当前状态的值。进一步分析,虽然,状态的值只有一个,但是到达这个状态的途径有很多,进一步想F
2017-03-02 16:58:30 576
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人