1.翻转树 2.单调栈,归并排序 4.并查集 3.最小公共祖先
第一题:
形如[[1,0],[2,1],[3,1],[4,1],[5,4],[6,5],[7,5]]的[id,parent]的树,返回翻转后的先序遍历的树
作者:joshua0509
链接:https://www.nowcoder.com/discuss/456780?type=all&order=time&pos=&page=1&channel=1009&source_id=search_all
来源:牛客网
vector<vector > invert_tree(int** node_data_list, int node_data_listRowLen, int* node_data_listColLen) {
int n = node_data_listRowLen;
int root = 0;
vector<vector<int> > tree(n+1, vector<int>());
vector<vector<int> > ans;//此处想到把相同根节点的集合起来,但没想到用 //vector<vector<int>>以及for实现
for(int i = 0; i < n; i++) {
int id = node_data_list[i][0];
int p = node_data_list[i][1];
if(p == 0) root = id;
else tree[p].push_back(id);
} //
for(int i = 1; i <= n; i++) {
reverse(tree[i].begin(), tree[i].end());
} //翻转每层
ans.push_back({root,0});
dfs(root, 0, tree, ans); //难在不知道怎么用先序遍历存储在ans中
return ans;
}
void dfs(int root, int parent, vector<vector >& tree, vector<vector >& ans) {
for(int i = 0; i < tree[root].size(); i++) {
ans.push_back({tree[root][i], root});
dfs(tree[root][i], root, tree, ans); //先存先序的第一个节点,更新root和parent再递归
}
}
第二题:经过风险等级最高的城市
图,最小公共祖先?
第三题 单调栈、归并排序
输入
5 初始序列的size
[0,1] [2,3] [] [] 几次交换的下标 如0,1交换
输出交换后的序列和原序列相比的不同的序列对数
如交换后是[5 2 3 1 4]和原来的[5 4 3 2 1]相比 顺序有几对发生了变化
作者:许愿++offer++
链接:https://www.nowcoder.com/discuss/456780?type=all&order=time&pos=&page=1&channel=1009&source_id=search_all
来源:牛客网
单调栈
void swap(int &a, int &b) {
int temp = a;
a = b;
b = temp;
}
int determine_virus_type(int size, int** swap_indexes, int swap_indexesRowLen, int* swap_indexesColLen) {
// write code here
vector arr;
for (int i = size; i > 0; i–) {
arr.push_back(i);
}
//交换后的数组
for (int i = 0; i < swap_indexesRowLen; i++) {
int m = swap_indexes[i][0];
int n = swap_indexes[i][1];
swap(arr[m], arr[n]);
}
int count = 0;
stack sk; //设计一个单调栈
for (int i = 0; i < size; i++) {
stack temp;
while (!sk.empty() && arr[i] > sk.top()) {
temp.push(sk.top());
sk.pop();
count++;
}
sk.push(arr[i]);
while (!temp.empty()) {
sk.push(temp.top());
temp.pop();
}
}
if (count % 2 == 0)
return 2;
else
return 1;
}
归并
模拟交换后用归并
作者:云晞
链接:https://www.nowcoder.com/discuss/456780?type=post&order=time&pos=&page=1&channel=1009&source_id=search_post
来源:牛客网
void mergeSort(vector<int>& num, int l, int r, int& ans, vector<int>& temp) {
if(l >= r) return;
int m = (l+r)/2;
mergeSort(num, l, m, ans, temp);
mergeSort(num, m+1, r, ans, temp);
int i = l;
int j = m+1;
int k = l;
while(i <= m && j <= r) {
if(num[i] > num[j]) {
ans += (j - m);
temp[k++] = num[j++];
} else {
temp[k++] = num[i++];
}
}
while(i <= m) temp[k++] = num[i++];
while(j <= r) temp[k++] = num[j++];
for(int i = l; i <= r; i++) num[i] = temp[i];
}
第四题 并查集 dfs
输入文件和文件的依赖关系 如[“A”,“B”,“C”,“D”,“E”] [[“A”,“B”],[“B”,“C”],[“D”,“E”]] 输出打包成的文件包[“A”,“B”,“C”] [“D”,“E”]
关于并查集https://leetcode-cn.com/problems/number-of-islands/submissions/
python版本https://blog.csdn.net/Mark_2018/article/details/107499850