题目链接:210. 课程表 II
class Solution {
public:
vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
vector<int> k;
k.clear(); //用来返回空数组
vector<int> ans;
ans.clear();
int tip=prerequisites.size();
int cnt=0;
int num[10005];
bool used[10005];
vector<int> f[10005];
memset(used,false,sizeof(used));
memset(num,0,sizeof(num));
for (int i=0;i<tip;i++){
int tip1=prerequisites[i].size();
num[prerequisites[i][0]]+=tip1-1; //课程入度
for (int j=1;j<tip1;j++){
f[prerequisites[i][j]].push_back(prerequisites[i][0]);
}
}
queue<int> q;
for (int i=0;i<numCourses;i++){
if (num[i]==0){
cnt++;
q.push(i);
ans.push_back(i);
used[i]=true; //已经入队
}
}
if (q.empty()) return k;
//拓扑排序
while (!q.empty()){
int now=q.front();
q.pop();
for (int i=0;i<f[now].size();i++){
num[f[now][i]]--;
if (num[f[now][i]]==0){
if (used[f[now][i]]) return k; //存在循环
q.push(f[now][i]);
ans.push_back(f[now][i]);
cnt++;
used[f[now][i]]=true;
}
}
}
if (cnt<numCourses) return k;
return ans;
}
};
题目链接:217. 存在重复元素
map
class Solution {
public:
bool containsDuplicate(vector<int>& nums) {
map<int,int> m;
int tip=nums.size();
for (int i=0;i<tip;i++){
if (m.find(nums[i])==m.end()){ //未出现过
m[nums[i]]=i;
}
else{
return true;
}
}
return false;
}
};
题目链接:222. 完全二叉树的节点个数
bfs
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int countNodes(TreeNode* root) {
queue<TreeNode*> q;
int cnt=0;
if (root==NULL) return 0;
q.push(root);
cnt++;
while (!q.empty()){
TreeNode* now=q.front();
q.pop();
if (now->left!=NULL){
q.push(now->left);
cnt++;
}
if (now->right!=NULL){
q.push(now->right);
cnt++;
}
}
return cnt;
}
};