面试题总结
1. 数组第k大的数
描述:给定两个有序数组,求出连个数组第k大的数。
例:[1, 2, 3, 4, 6 ,8] , [2, 3, 4, 8,10], k=4
输出:3
题解1:归并排序,到第k个输出
题解2:使用二分的思想,进行切分
参考博客:https://blog.csdn.net/qiki_tangmingwei/article/details/80957855
//A= [1,2,3,4,5,6] B=[2,3,4,5] k=5
int getKmax(int* A,int* B,int len1,int len2,int k)
{
if(len1>len2) //每次让A的长度是较短的
return getKmax(B,A,len2,len1,k);
if(len1==0)
return B[k-1];
if(k==1)
return min(A[0],B[0]);
int k1=min(k/2,len1);
int k2=k-k1;
if(A[k1-1]>B[k2-1])
return getKmax(A,B+k2,len1,len2-k2,k-k2);
else if(A[k1-1]<B[k2-1])
return getKmax(A+k1,B,len1-k1,len2,k-k1);
else
return A[k1-1];
}
2. 二维有序数组查找
描述:在一个二维有序数组中查找一个数是否存在
参考:https://blog.csdn.net/gegeyanxin/article/details/99445279
bool is_exist(int A[][4],int i,int j,int k)
{
if(i<0||j<0)
return false;
if(A[i][j]==k)
return true;
if(A[i][j]>k)
return is_exist(A,i,j-1,k);
if(A[i][j]<k)
return is_exist(A,i+1,j,k);
return false;
}
3. 求一颗二叉树左叶子节点之和
int getSumleft(Treenode* root)
{
if(!root)
return 0;
if(root->left&&root->left->left==NULL&&root->left->right==NULL)
return root->left->val+getSumleft(root->right);
return getSumleft(root->left)+getSumleft(root->right);
}