腾讯精选50题—Day15题目 231,235,236
第十五天~
1. 题目231 2的幂
(1) 题目描述
(2) 思路
笨方法,循环。
(3) 题解
class Solution {
public:
bool isPowerOfTwo(int n) {
if (n < 1)
return false;
if (n == 1)
return true;
else {
if (n % 2 != 0)
return false;
while (n!=1)
{
int temp = n % 2;
if (temp % 2 != 0)
return false;
n = n / 2;
}
return true;
}
}
};
结果:
时间复杂度:
O
(
l
o
g
n
)
O(logn)
O(logn)
空间复杂度:
O
(
1
)
O(1)
O(1)
2. 题目 235 二叉搜索树的最近公共祖先
(1) 题目描述
(2) 思路
利用二叉树搜索树左子树的值<根节点的值<右子树的值这一特性。
(3) 题解
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if ((root->val - p->val) * (root->val - q->val) <= 0)
{
return root;
}
else {
if (root->val > p->val)
{
return lowestCommonAncestor(root->left, p, q);
}
else {
return lowestCommonAncestor(root->right, p, q);
}
}
}
};
结果:
时间复杂度:
O
(
n
)
O(n)
O(n)
空间复杂度:
O
(
1
)
O(1)
O(1)
3. 题目236 二叉树的最近公共祖先
(1) 题目描述
(2) 思路
详见参考1 二叉树的最近公共祖先。
(3) 题解
递归解法:
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if (root == NULL)
return NULL;
if (root == p || root == q)
return root;
TreeNode* left = lowestCommonAncestor(root->left, p, q);
TreeNode* right = lowestCommonAncestor(root->right, p, q);
if (left == NULL)
return right;
if (right == NULL)
return left;
if (left && right)
return root;
return NULL;
}
};
结果:
时间复杂度:
O
(
n
)
O(n)
O(n)
空间复杂度:
O
(
n
)
O(n)
O(n)