8.25奇安信C++笔试
看到许多同学第一题是用的拓扑排序的方法,这里贴一个动态规划的方法:
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * 计算dag 路径上起始到目的节点的路径数目 * @param nodes int整型vector<vector<>> 第 i 个数组中的单元都表示有向图中 i 号节点所能到达的下一些结点(译者注:有向图是有方向的,即规定了 a→b 你就不能从 b→a ),若为空,就是没有下一个节点了。 * @return int整型 */ int DagPathNum(vector<vector<int> >& nodes) { // write code here int ans = 0; int n = nodes.size(); vector<vector<int>> dp(n, vector<int>(n, 0)); for (int i = 0; i < n; ++i){ for (int d : nodes[i]){ dp[i][d] = 1; } } for (int i = n - 2; i >= 0; --i){ for (int j = i + 1; j < n; ++j){ for (int k : nodes[i]){ dp[i][j] += dp[k][j]; } } } return dp[0][n - 1]; } };第二题就简单了,双指针求解:
#include<iostream> #include<vector> #include<string> #include<algorithm> using namespace std; class Solution { public: int MaxArea(vector<int> &points){ int left = 0, right = points.size() - 1; int ans = 0; while (left<right) { ans = max(ans, (right - left)*min(points[left], points[right])); if (points[left] <= points[right]) ++left; else --right; } return ans; } }; int main(){ //vector<int> points = { 4, 1, 2, 7 }; Solution s; string nums; while (getline(cin, nums)){ vector<int> points; string t = ""; for (int i = 1; i < nums.size() - 1; ++i){ if (nums[i] == ','){ points.emplace_back(stoi(t)); t.clear(); } else{ t += nums[i]; } } if (t.size()>0) points.emplace_back(stoi(t)); cout << s.MaxArea(points) << endl; getchar(); } return 0; }