本文链接: https://blog.csdn.net/qq_34811382/article/details/112910600
88 合并两个有序数组
思路:
双指针法
从后向前,p1后面有m+n-p1-1个元素,
在任意时刻nums1有m-1-p1个元素被放入后面,而nums2中有n-1-p2个元素被放入后面。
而(m+n-p1-1>m-1-p1+n-1-p2)==>(p2>-1)恒成立,所以从后面拿出的元素不会把前面的覆盖。ps:temp = nums2[p2- -]等价于temp=nums2[p2]; p2=- -;
代码:
class Solution
{
public:
void merge(vector<int> &nums1, int m, vector<int> &nums2, int n)
{
int p1 = m - 1, p2 = n - 1;
int temp;
while (p1 >= 0 || p2 >= 0)
{
if (p1 < 0)
{
temp = nums2[p2--];
}
else if (p2 < 0)
{
temp = nums1[p1--];
}
else if (nums1[p1] > nums2[p2])
{
temp = nums1[p1--];
}
else
{
temp = nums2[p2--];
}
nums1[p1 + p2 +2] = temp; //因为上面已经减了所以这里是加2
}
}
};
89 格雷编码
思路:
位运算
格雷编码,说白了就是二进制码上只有一位不同,利用异或运算计算。即
i^(i>>1),就是i与本身右移一位异或就是结果。
代码:
class Solution
{
public:
vector<int> grayCode(int n)
{
vector<int> res(1 << n, 0);
for (int i = 0; i < (1 << n); i++)
{
res[i] = i ^ (i << 1);
}
return res;
}
};
104 二叉树的最大深度
思路:
利用递归的方法,判断是否为叶子节点,叶子节点即没有子节点,就是该节点==nullptr。
代码:
class Solution
{
public:
int maxDepth(TreeNode *root)
{
if (root == nullptr)
return 0;
int LeftDepth = 1, RightDepth = 1;
if (root->left != nullptr)
LeftDepth += maxDepth(root->left);
if (root->right != nullptr)
RightDepth += maxDepth(root->right);
return LeftDepth > RightDepth ? LeftDepth : RightDepth;
}
};