剑指 Offer 55 - II. 平衡二叉树
/*** Definition for a binary tree node.* struct TreeNode {*int val;*TreeNode *left;*TreeNode *right;*TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/class Solution {public:bool isBalanced(TreeNode* root) {if (!root) {return 1;}return isBalanced(root->left) && isBalanced(root->right) && abs(dfs(root->left) - dfs(root->right)) < 2;}private://计算深度int dfs(TreeNode *root) {if (!root) {return 0;}return max(dfs(root->left), dfs(root->right)) + 1;}};
平衡二叉树的要求是,每个节点的左右子树深度差不超过1,那么我们就可以将其分为两步,一步是计算一个节点的高度差,另一步就是以平衡二叉树的条件遍历每一个节点,保证其每个节点都是平衡二叉树,这个数整体才是平衡二叉树 。
剑指 Offer 56 - I. 数组中数字出现的次数
class Solution {public:vector
这里利用了抑或运算的特性,相同的数进行疑惑运算结果为0,那么我们对整个数组进行抑或运算就得到了两个只出现一次的数的抑或结果x 。此时的问题就成了怎么获取其中一个数,只要我们有了其中一个只出现一次的数,那么另一个数就可以使用之前的抑或结果x和其再进行一次抑或运算就能得出另一个数了 。此时我们可以想到,因为x是所有数抑或操作后的结果,再根据抑或的特性,相同二进制位相同时为0,也就是说明这两个只出现一次的数在这个位上不可能都是1,即第一个数在这个位上是1,那么另一个数在这个位上必不是1 。那么就可以通过这个特性来获取其中之一的数了,我们这里使用flag存储x & (-x)操作的结果,x & (-x)本身的作用是得到最低位的1,所以我们对数组整体再进行遍历操作,判断条件就是如果和flag与运算之后不为0,即这个数在刚求出来的最低位上也是1,那么就将其和(初始化为0)进行抑或运算,一直到数组结束,还是因为上边所说的,相同的数进行抑或运算之后结果为0,所以遍历完一遍之后这个就是两个数其中的一个数了,剩下的操作上边也都说过了,这样就得到了这两个只出现一次的数了 。
剑指 Offer 56 - II. 数组中数字出现的次数 II
方法一:class Solution {public:int singleNumber(vector
方法一:自己创建一个三进制方法,看不太懂 。
方法二:如果一个数字出现3次,它的二进制每一位也出现的3次 。如果把所有的出现三次的数字的二进制表示的每一位都分别加起来,那么每一位都能被3整除 。我们把数组中所有的数字的二进制表示的每一位都加起来 。如果某一位能被3整除,那么这一位对只出现一次的那个数的这一肯定为0 。如果某一位不能被3整除,那么只出现一次的那个数字的该位置一定为1 。
- 《窥情》未删减版在哪儿在线观看
- android应用程序开发!在字节跳动我是如何当面试官的,威力加强版
- 初一上册数学 初一上册数学书电子版
- 最值得普通人学的编程语言是哪个?
- win10企业版ltsc密钥 win10企业版ltsc有录屏功能吗
- 造梦西游4好号和密码真的90级 造梦西游4好号和密码真的手机版
- iqooneo7竞速版屏幕尺寸
- 一九四二电影免费完整版在哪儿在线观看
- 偷窥课程完整版是什么电影
- 医用口罩和普通口罩有什么区别