看到许多同学第一题是用的拓扑排序的方法,这里贴一个动态规划的方法:
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;
}
#奇安信笔试##奇安信23秋招题怎么回事,看不懂#