做了幾道模擬題。
第一道,遞歸。
簡單,不必多說。直接貼代碼:
int F(int k, int n) {
int m = 0;
if(k == 0){
return n;
}
else{
for(int i = 0; i <= n; ++i){
m+=F(k-1,i);
}
return m;
}
}
第二道,會議安排問題。
第一個想到的是兩個for循環。這樣複雜度太高了。提交時間也超時了。貼代碼:
int assignConferenceRoom1(vector<int>& A, vector<int>& B) {
int all = 0;
for(int i = 0; i < A.size(); ++i){
int m = 10000;
int lo = -1;
for(int j = 0; j < B.size(); ++j){
int cost = B[j] - A[i];
if(cost >= 0 && cost < m){
lo = j;
}
}
if(lo != -1){
B[lo] = -1;
all++;
}
}
return all;
}
那麼怎麼降低複雜度呢。想到,這樣一一對應比較選出來就進入下一個的問題,可以先進行排序。然後遍歷一個會場的函數就可以了。這麼多會場能安排多少場是多少場。人數不用遍歷,因爲是按順序排的。
貼代碼:
int assignConferenceRoom(vector<int>& A, vector<int>& B){
int all = 0;
sort(A.begin(),A.end());
sort(B.begin(),B.end());
int j = 0;
for(int i = 0; i < B.size() && j < A.size(); ++i){
if(A[j] <= B[i]){
all++;
j++;
}
}
return all;
}
第三道,二叉樹的比較。相同的二叉樹返回true,不同返回false。
思想比較簡單,但是還是略複雜了一些。因爲爲了編寫簡單,二叉樹的遍歷使用了遞歸的遍歷方法。一旦遞歸就必須把這個樹遍歷完了。遍歷完才能輸出是否是true的。如果是迭代的遍歷,如果錯誤的話,可以從中間停止,輸出false。但是用遞歸的方法,沒有超時,也可以。
貼代碼:
bool isEqual(TreeNode* p, TreeNode* q){
if(p!= NULL && q!= NULL){
if(p->val != q->val){
return false;
}
return isEqual(p->left,q->left) && isEqual(p->right,q->right);
}
if((p == NULL && q!= NULL) || (p != NULL && q== NULL)){
return false;
}
return true;
}