关于第一个改动使运行速度提升的原因,在查阅vector相关资料后并没有直接的回答。我个人的理解是,vector本身是对数组的封装,其低层实现就是数组,为了保证动态性,执行效率肯定比数组低。第一种定义方式定义了一个二维动态数组,而第二种定义方式虽然定义的也是一个二维数组,但其一维是固定的,一维是动态的,其执行效率必然优于二维都是动态的数组。关于第二个改动使运行速度提升的原因,我认为是比较显然的。函数在值传递时,为了保护原有数据不被改变,会先创建一个原数据的副本,用于在函数执行中调用,创建副本的操作是有一定开销的。而函数在引用传递时,仅将原数据的地址传入函数的上下文中,其开销远比创建副本来的小,效率固然有明显提升。但这样其实牺牲了数据的安全性,在实际项目中需要斟酌后进行选择。在之后又测试了将邻接表定义方式改回二维动态数组,而传值用引用传递的情况,结果是在第三个用例处超时。说明动态数组的开销还是较大的,在算法题中还是尽量避免使用vector吧。niu
#include <iostream> #include <vector> #include <string> using namespace std; int findRed(int i, string& str, vector<int> table[], vector<int>& dp){ int count = str[i] == 'R'; for(int j = 0;j < table[i].size();j++){ count += findRed(table[i][j], str, table, dp); } return dp[i] = count; } int main(){ ios::sync_with_stdio(false); int n; cin >> n; vector<int> table[n]; vector<int> dp(n, 0); for(int i = 1;i < n;i++){ int parent; cin >> parent; table[parent - 1].push_back(i); } string str; cin >> str; findRed(0, str, table, dp); int q; cin >> q; while(q--){ int x; cin >> x; x--; cout << dp[x] << endl; } }