给你两个有序整数数组nums1 和nums2,请你将nums2 合并到nums1 中,使nums1 成为一个有序数组。
初始化nums1和nums2的元素数量分别为m和n 。你可以假设nums1 有足够的空间(空间大小等于m + n)来保存nums2中的元素。
思路:两指针法,由高到低比较插入
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
if(m==0){
nums1=nums2;
return;
}
if(n==0) return;
int i=m-1,j=n-1,k=m+n-1;
while(j>=0)
{
if(nums2[j]>=nums1[i])
{
nums1[k]=nums2[j];
k--;
j--;
}
else{
nums1[k]=nums1[i];
i--;
k--;
}
while(i==-1&&j>=0)
{
nums1[k]=nums2[j];
k--;
j--;
}
}
}
};
格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个位数的差异。
给定一个代表编码总位数的非负整数 n,打印其格雷编码序列。即使有多个不同答案,你也只需要返回其中一种。
格雷编码序列必须以 0 开头。
思路:动态规划,
n=0时,res=[0]
n=1时,res=[0,1],res[1]=res[0]+0x1<<0;
n=2时,res=[0,1,3,2],res[2]=res[1]+0x1<<1,res[3]=res[0]+0x1<<1;
n=3时,res=[0,1,3,2,6,7,5,4],res[4]=res[3]+0x1<<2;res[5]=res[2]+0x1<<2;res[6]=res[1]+0x1<<2;res[7]=res[0]+0x1<<2;
class Solution {
public:
vector<int> grayCode(int n) {
vector<int>res(0x1<<n);
res[0]=0;
if(n==0) return res;
for(int i=1;i<n+1;i++)
{
int t=0x1<<i;
for(int j=t-1;j>t/2-1;j--)
{
res[j]=res[t-1-j]+t/2;
}
}
return res;
}
};
给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明:叶子节点是指没有子节点的节点。
class Solution {
public:
int maxDepth(TreeNode* root) {
if(root==nullptr)
return 0;
int left=(root->left==nullptr)?0:maxDepth(root->left);
int right=(root->right==nullptr)?0:maxDepth(root->right);
return 1+std::max(left,right);
}
};