自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(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-&gt...

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关注的人

提示
确定要删除当前文章?
取消 删除