题目描述
N个会议要同时举行,参会人数分别为A[0], A[1], ..., A[N-1]. 现有M个会议室,会议室可容纳人数分别为B[0], B[1], ..., B[M-1]. 当A[i]<=B[j]时,可以把会议i安排在会议室j,每间会议室最多安排一个会议,每个会议最多只能安排一个会议室. 求最多安排多少个会议.
1 <= N, M <= 100000, 每个会议的参会人数和每间会议室的容纳人数均在1和1000之间.
请为下面的Solution类实现解决上述问题的函数assignConferenceRoom. 函数参数A和B的意义如上,返回值为最多可安排的会议数.
class Solution {
public:
int assignConferenceRoom(vector<int>& A, vector<int>& B) {
}
};
例1:A={2, 3}, B={1, 2},答案为1.
例2:A={3, 4, 5},B={10, 3, 2},答案为2.
思路:
先将两个数组的元素进行排序,然后从头开始比对,如果A[i]<=B[j]的话则说明可以安排该会议,接着就考虑下一个会议,若不满足则考虑下一个会议室,这样比较下去就可得到可以安排的最多会议数。因为这样使得会议的参会人数和会议室的容纳人数最为接近,所以得到的结果就是最优的安排结果。
代码:
class Solution{
public:
int assignConferenceRoom(vector
& A, vector
& B) {
vector
a(1001, 0);
vector
b(1001, 0);
int size1 = A.size();
int size2 = B.size();
for(int i = 0; i < size1; i ++){
a[A[i]] ++;
}
for(int i = 0; i < size2; i ++){
b[B[i]] ++;
}
int sum = 0;
for(int i = 0; i <= 1000; i ++){
int num = b[i];
for(int j = 0; j <= i; j ++){
if(num == 0) break;
else if(num > a[j]){
num = num - a[j];
sum = sum + a[j];
a[j] = 0;
}
else{
a[j] = a[j] - num;
sum = sum + num;
num = 0;
}
}
}
return sum;
}
};
题目描述
两个二叉树结构相同,且对应结点的值相同,我们称这两个二叉树等价.
例如:以下两个二叉树等价
1 1
/ \ / \
2 3 2 3
而以下两个则不等价
1 1
/ \ / \
2 3 3 2
以下两个也不等价
1 1
/ \ / \
2 3 2 2
给出两个二叉树p和q,判断它们是否等价.
p和q的结点数不多于100000,每个结点的数值在1和1000000000之间.
请为下面的Solution类实现解决上述问题的isEqual函数,函数的两个参数p和q分别代表两个二叉树的根节点,如果以p和q为根的二叉树等价则函数返回true,否则返回false.
/**
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 isEqual(TreeNode* p, TreeNode* q) {
}
};
思路:
使用递归的方法,判断两个二叉树是否等价,先判断当前节点的值是否相等,再依次调用该函数来判断两个二叉树的左、右分支是否等价,若中间出现不相等的情况则立即返回false,而直到最后都没有不相等的情况则返回true。
代码:
class Solution {
public:
bool isEqual(TreeNode* p, TreeNode* q) {
if(p == NULL && q == NULL)
return true;
else if((p == NULL && q != NULL) || (p != NULL && q == NULL) || (p->val != q->val))
return false;
else if(p->val == q->val){
return isEqual(p->left, q->left) && isEqual(p->right, q->right);
}
}
};