leetcode_sicily

做了幾道模擬題。

第一道,遞歸。

簡單,不必多說。直接貼代碼:

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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章