
C语言编程
qq_31699373
这个作者很懒,什么都没留下…
展开
-
整数自动转换原则
整数转换规则中的无符号和有符号的转换问题:当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型。例如unsigened int a=-10; int b=1; 一个三元表达式中(a+b>5)?printf("a>b"):printf("b?>a"); 这里的结果是a>b因为-10变成了一个非常大的正整数,注意有些同学做实验时用printf来验证输出的数值,这其实是原创 2016-08-14 09:36:13 · 325 阅读 · 0 评论 -
669. 修剪二叉搜索树
一开始的思路是凭借一个pre指针,pre指针指向当前遍历节点的父节点,然后当发现该节点不符合要求时,利用二叉搜索树的性质,若该节点是小于左边界的,则它的左子树也势必不符合要求,此时将该节点的父节点指向该节点的右子树。当该节点的值大于r时同理。但是没成功,自己没想到这种方法的解决办法,感觉一个原因是因为根节点的父节点这个问题不好处理。但是这种带着父节点参数的问题以后还是要注意总结。class S...原创 2018-09-02 15:11:57 · 163 阅读 · 0 评论 -
637. 二叉树的层平均值
这道题,为了训练递归能力,不用BFS做,但是发现csdn或者leetcode的discuss里很多都是用bfs做的,表示现在一看到队列就觉得low。。。。。。偶尔发现有递归版本,但是不是用带深度这一参数的方式实现的,所以我感觉不够纯粹。到这里,还是b站清华大佬六批,思路够纯粹,且适合初学者。这种技巧的核心是怎么能记录下来每一层的值的和是多少,其实可以联想“数组”可以通过对应下标处理对应的值,于...原创 2018-09-02 16:12:46 · 443 阅读 · 1 评论 -
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 · 205 阅读 · 0 评论 -
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 · 144 阅读 · 0 评论 -
543. 二叉树的直径
一种比较好的思路是。随便找一个点(一般取根节点),找到这棵树中,距离这个点最远的点,再从找到的这个点开始,找到距离它最远的点。这种思路是带有很强烈的数学成分。证明可自行解决。 b站大佬是用动归来做的,我不是很好理解。 这里给出一种基础做法,即借助求二叉树的深度的方式。对于每一个节点,求其左右子树的最大深度,然后对于每一个子节点的左右深度加和,与一个统计树的直径的全局变量作...原创 2018-09-07 09:57:56 · 1156 阅读 · 0 评论 -
二维数组中的查找---剑指offer
一开始的思路,因为矩阵中的元素向右或者向右是递增的,考虑将二维数组压缩成一个一维数组,然后二分查找。但是仔细分析,发现这样不是很靠谱,因为可以写个例子看看,从第一行开始从左向右,从上到下地将元素压入一维数组中,并不是严格的单调递增,所以不适合用二分查找。 看了牛友们的思路后,发现了非常秒的方法。即从左下角开始,与待查元素进行比较,如果比矩阵中的元素小,则向上移动;如果比矩阵...原创 2018-09-17 19:28:32 · 185 阅读 · 0 评论 -
437. 路径总和 III
有种不错的方法符合我刚开始想使用数组的设想。见这篇博文:其中每次都将新遍历到的节点,都加到整个数组中,这样,当前数组中存储的每一个位置(i:从0到size-1)的值,代表的是----从该位置(i)出发,到达新遍历的这个节点的路径和。----其实有种动归的思想在里面。这个操作简直太妙了,另一个妙的地方,即数组设为传值调用,使得每次都能回到原来的状态,然后再从那个状态到那个状态的另一个子树去遍历,...原创 2018-09-07 11:40:09 · 269 阅读 · 0 评论 -
606. 根据二叉树创建字符串
这题的关键是看懂题意。特么也不提醒一下,要靠自己抽象吗???https://blog.youkuaiyun.com/obrcnh/article/details/77996276 参考了这篇博文,博主看出了规律。B站大佬更是牛批,上来直接做。。。。规律如下:(1)当某个节点左右两个子节点均不为空时,应加上(),并在其中加上子节点的值;而当某个节点只存在左子节点时,则可以省略右子节点对应的()。...转载 2018-09-10 20:39:47 · 257 阅读 · 0 评论 -
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 · 228 阅读 · 0 评论 -
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 · 154 阅读 · 0 评论 -
338. 比特位计数
首先要掌握一个基本操作,即如何求一个整数中1的个数。网上一般有多种操作,我比较喜欢“位移”的方法。while (temp>0){if ( (temp & 1) == 1 ){//temp & 1如果re最低位是1,则结果等于1 //计数器加一 }temp = temp >> 1;//向右移位}注意,上面的操作是针对待求数是非...原创 2018-09-14 17:42:08 · 114 阅读 · 0 评论 -
leetcode 494目标和
在深度优先搜索专题看到了这道题,个人感觉有动态规划是最正统的方法。但是为了训练递归能力,还是用dfs做吧。看了一份题解才发现,这是一道典型的搜索和回溯结合的问题。一定要记住其中的细节,即搜索完以后要回溯!!!class Solution {public: int ret=0; void dfs(vector<int>& nums,int S,int pos...转载 2018-10-22 07:54:29 · 360 阅读 · 0 评论 -
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 · 309 阅读 · 0 评论 -
208. 实现 Trie (前缀树)
Trie(前缀树/字典树)及其应用字典树节点的定义和字符串的构造。代码如下:struct Node{ Node* nxt[26];//这里可以初始化为更多的子节点 int flag;//标记该到节点是不是一个单词 Node(){ //构造函数,初始化每个子节点为NULL,且该节点不表示一个单词,即flag=0 for(int i=0;...原创 2018-09-04 16:12:46 · 437 阅读 · 0 评论 -
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 · 112 阅读 · 0 评论 -
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 · 83 阅读 · 0 评论 -
110. 平衡二叉树
对于这种有单独操作(求树的高度)又夹杂另一操作(随时判断一棵树的左右子树的高度)的,且这一另一操作贯穿于整棵树始终的。要把这两种操作结合起来。class Solution {public: bool flag=true; int height(TreeNode* root) { if(root==NULL) { ...原创 2018-08-14 15:58:30 · 109 阅读 · 0 评论 -
129. 求根到叶子节点数字之和
有一篇讲得非常好的:https://blog.youkuaiyun.com/qq_26410101/article/details/80554845 先说一下一开始的错误,首先是在遇到叶子节点以后企图将temp clear调,这样是完全不对的;因为temp全局的,清空temp会让除了该叶子节点以外的前面的节点也清除掉。这样比如说访问完某个节点的左子树以后,再访问该节点的右子树时,根节点已经不在里...转载 2018-08-14 17:23:42 · 409 阅读 · 0 评论 -
116. 填充同一层的兄弟节点
https://www.cnblogs.com/ariel-dreamland/p/9165670.html 这篇文章给出了多种方法,不错。通过该题可以抽象出的核心问题是--------跨子树处理操作问题。 递归的思想还是需要训练: 递归方法中,下面这句是一个关键,它表征了该题的规律。if (root -> next) ...转载 2018-08-15 10:00:24 · 159 阅读 · 0 评论 -
690. Employee Importance
一开始写的很麻烦,是因为忘记了auto的使用,auto适合做这种数据结构比较复杂的题。使用auto一般要结合for迭代循环,即for(:)可以参考一篇博文 https://blog.youkuaiyun.com/u010141928/article/details/78671452该题的题意多少有些模糊,其实是求不仅是直接下属的所有员工的weight的和,还有直接下属的员工的直接下属的员工。cl...原创 2018-08-15 19:17:58 · 161 阅读 · 0 评论 -
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 · 250 阅读 · 0 评论 -
491. 递增子序列
第一种方法是暴力枚举,需要能考虑到给定的集合大小是15以内,并且知道一个数学知识:即一个集合的子集个数是2^n,所以枚举的话最多是2^15方,还是可以运算的。知道了这个以后就需要知道如何用C/C++程序实现对一个给定集合的所有子集的查找。详情可以参考这篇文章,思考一下就能看懂。https://blog.youkuaiyun.com/yanerhao/article/details/77075462比如...原创 2018-08-08 16:09:03 · 617 阅读 · 0 评论 -
114. 二叉树展开为链表
首先是原地算法的定义:算法原地工作的含义是指不需要任何额外的辅助,算法所需要的辅助空间不随着问题的规模而变化,是一个确定的值。通过观察示例可以知道,我们可以猜想,大方向是前序遍历。第一种思路:dfs。设置一个全局的指针(这种做法有点脱离原地算法,因为多开辟了一个指针变量)核心思想是拿到一个根节点以后,将其左右子树断开。然后将作为全局变量的右孩子指向刚断开左孩子和右孩子的根节点(flat...原创 2018-08-23 08:30:19 · 224 阅读 · 0 评论 -
109. 有序链表转换二叉搜索树
该题不同于108的一个难点是,链表无法采用下标访问的方式来获取元素。我的初始思路是,定义一个数组,将链表的值都push_back到vector里面,然后套用108的方法进行做。这样的话额外空间复杂度是O(n),比较费空间,且思路无亮点。在看过网上的一些思路后,发现牵扯一个链表常考的知识点,即快慢指针。这里快慢指针的一个用法是:可以通过快慢指针找到一个链表的中间节点。注意,快慢指针初始化时可...原创 2018-08-31 07:15:34 · 208 阅读 · 0 评论 -
117. 填充同一层的兄弟节点 II
这个题打算用来做DFS的练手的,但是用了下递归发现找不到很好的思路。看网上的答案也不是很明白。采用BFS做,一开始用last和nlast的方法,发现复杂度有点高,而且又碰到了该死的“空指针危险的”问题。搜了一下网上的答案,发现有一个BFS的思路非常不错,和传统BFS思路结合的不错。https://blog.youkuaiyun.com/guicaisa/article/details/482497...原创 2018-08-31 10:34:41 · 243 阅读 · 0 评论 -
337. 打家劫舍 III
这其实是一个在“图”上选或者不选的问题。因为这是一棵二叉树,所以选或者不选主要是对当前节点及其左右子树进行判断。如果选当前节点,则意味着-------;如果不选当前节点,则意味着------。(用文字不容易说清楚,直接见代码即可)。class Solution {public: pair<int,int> dfs(TreeNode* root) { ...原创 2018-08-24 09:22:21 · 355 阅读 · 0 评论 -
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 · 146 阅读 · 0 评论 -
101. 对称二叉树
采用递归和迭代两种方法:(1)递归:在一开始做的时候,试图用二叉树的中序遍历来做。因为我发现对于对称的二叉树,中序遍历的结果也是对称的。所以以为,构建一个vector,然后中序遍历一遍,然后对这个vector,看是否对称,即可得到是否是对称二叉树。但是,运行时一个反例,让我明白这个简单粗暴的方法是不行的。比如下面这个例子,【1,2,3,3,null,2,null】这棵非对称二叉树的中序遍历...原创 2018-08-31 15:45:47 · 182 阅读 · 0 评论 -
98. 验证二叉搜索树
(1)非递归的方法我能想出来,即中序遍历,只要前面的数大于等于后面的,则不是BST。(2)然鹅,我们最主要是为了训练递归的方法。下面介绍递归方法:https://blog.youkuaiyun.com/feliciafay/article/details/18400865这里采用了为每个节点传入最大最小值的技巧,该题用递归判断是否是二叉搜索树,必须用这个方法。该题还有一个问题即我用,b站视频的...转载 2018-09-01 15:29:47 · 89 阅读 · 0 评论 -
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 · 229 阅读 · 0 评论 -
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 · 555 阅读 · 0 评论