1.

小明陪小红去看钻石,他们从一堆钻石中随机抽取两颗并比较她们的重量。这些钻石的重量各不相同。在他们们比较了一段时间后,它们看中了两颗钻石g1和g2。现在请你根据之前比较的信息判断这两颗钻石的哪颗更重。

给定两颗钻石的编号g1,g2,编号从1开始,同时给定关系数组vector,其中元素为一些二元组,第一个元素为一次比较中较重的钻石的编号,第二个元素为较轻的钻石的编号。最后给定之前的比较次数n。请返回这两颗钻石的关系,若g1更重返回1,g2更重返回-1,无法判断返回0。输入数据保证合法,不会有矛盾情况出现。

测试样例:
2,3,[[1,2],[2,4],[1,3],[4,3]],4
返回: 1

思路:比较图上两点的拓扑关系。可以使用拓扑排序,一种更简单的方法是,直接check两点的可达性。

class Cmp {
public:
const int INF = 0x3f3f3f3f; bool canArr(int cur, int g2, int n)
{
queue<int>que;
que.push(cur);
bool vis[];
for(int i = ; i <= n; i ++){
vis[i] = false;
}
vis[cur] = true;
while(!que.empty()){
cur = que.front();
que.pop();
if(cur == g2) return true;
for(int i = ; i < (int)g[cur].size(); i ++){
int nx = g[cur][i];
if(!vis[nx]){
vis[nx] = true;
que.push(nx);
}
}
}
return false;
} int cmp(int g1, int g2, vector<vector<int> > records, int n) {
// write code here
for(int i = ; i <= n; i ++){
g[i].clear();
}
for(int i = ; i < (int)records.size(); i ++){
int u = records[i][], v = records[i][];
g[u].push_back(v);
} if(g1 == g2){
return -;
}
bool g1A = canArr(g1, g2, n), g2A = canArr(g2, g1, n);
if(g1A){
return ;
}else if(g2A){
return -;
}else{
return ;
}
}
private:
vector<int>g[];
};

  dfs会TorSegment Error。 以后能用BFS还是首选宽度优先搜索吧!

2.

有一棵二叉树,树上每个点标有权值,权值各不相同,请设计一个算法算出权值最大的叶节点到权值最小的叶节点的距离。二叉树每条边的距离为1,一个节点经过多少条边到达另一个节点为这两个节点之间的距离。

给定二叉树的根节点root,请返回所求距离。

思路:求的是叶节点。一开始没看清楚求成了任意两个节点。  仔细想想  ,只用找到两个点的最近公共祖先节点,然后将距离相加就好了!

  求最近公共祖先节点需要用到 parent来记录每个节点的父节点。然后就变成了两个链表 最后汇聚到同一个点(祖先)。找到这个点就好了。需要先将两个链表的长度统一成较小的这样方便找到公共点。

/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/ class Tree {
public:
const int INF = 0x3f3f3f3f; TreeNode* parents[]; void travelNodes(TreeNode* root, TreeNode* last)
{
if(root){
if(minNode -> val > root -> val && !root -> left && !root -> right){
minNode = root;
}if(maxNode -> val < root -> val && !root -> left && !root -> right){
maxNode = root;
}
parents[root -> val] = last;
travelNodes(root -> left, root);
travelNodes(root -> right, root);
}
} int height(TreeNode *rt)
{
int len = ;
while(parents[rt -> val]){
len ++;
rt = parents[rt -> val];
}
return len;
} int disToCANone(TreeNode *comAscNode, TreeNode* n1, TreeNode* n2)
{
queue<TreeNode *>que;
que.push(comAscNode);
int steps = , dis1 = , dis2 = ;
while(!que.empty()){
int cnt = que.size();
while(cnt --){
TreeNode* cur = que.front();
que.pop();
if(cur == n1){
dis1 = steps;
}if(cur == n2){
dis2 = steps;
}
if(cur -> left)
que.push(cur -> left);
if(cur -> right)
que.push(cur -> right);
}
steps ++;
}
return dis1 + dis2;
} TreeNode *getComAscNode(TreeNode * minNode, TreeNode *maxNode)
{
int len1 = height(minNode);
int len2 = height(maxNode);
for(;len1 > min(len1, len2); len1 --)
minNode = parents[minNode -> val];
for(;len2 > min(len1, len2); len2 --)
maxNode = parents[maxNode -> val];
while(minNode != maxNode){
minNode = parents[minNode -> val];
maxNode = parents[maxNode -> val];
}
return minNode;
}
int getDis(TreeNode* root)
{
minNode = new TreeNode(INF);
maxNode = new TreeNode(-INF);
travelNodes(root, NULL);
TreeNode *comAscNode = getComAscNode(minNode, maxNode);
return disToCANone(comAscNode, minNode, maxNode); }
TreeNode* minNode, *maxNode; };

  上面这种方法有局限性,如果树中节点的value必须不同才可以。下面优化成 任意树,使用map来存parent。这道题是 LeetCode

https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-tree/#/description  仅仅是求LCA的。

/**
* 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:
void calcPath(TreeNode* root){
queue<TreeNode*>que;
que.push(root);
while(!que.empty()){
TreeNode *p = que.front();
que.pop();
if(p -> left){
parent[p -> left] = p;
que.push(p -> left);
}if(p -> right){
parent[p -> right] = p;
que.push(p -> right);
}
}
} TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(root == NULL) return NULL;
vector<TreeNode*>pathP;
vector<TreeNode*>pathQ;
calcPath(root); // 求每个节点的parent
// 得到p and q到根节点的路径
TreeNode *tp = p, *tq = q;
pathP.push_back(p);
while(parent[tp]){
pathP.push_back(parent[tp]);
tp = parent[tp];
}
pathQ.push_back(q);
while(parent[tq]){
pathQ.push_back(parent[tq]);
tq = parent[tq];
}
// 将路径反序
reverse(pathP.begin(), pathP.end());
reverse(pathQ.begin(), pathQ.end()); // 从rt出发找到最近祖先
int i = , len = min(pathP.size(), pathQ.size());
TreeNode *ans = NULL;
while(i < len){
if(pathP[i] == pathQ[i]){
ans = pathP[i];
}else{
break;
}
i ++;
}
return ans;
}
map<TreeNode*, TreeNode*>parent;
};

3。

有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数。

给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在。

测试样例:
[1,3,5,2,2],5,3
返回:2

Ans:

//快拍的partition,记住key = a[l], 先从后向前找,这样保证每次循环交换两次,key依然在a[i]的位置上。
int partition(vector<int>&a, int l, int r)
{
int key = a[l];
while(l < r){
while(l < r && a[r] <= key) r --;
swap(a[l], a[r]);
while(l < r && a[l] >= key) l ++;
swap(a[l], a[r]);
}
return l;
} int findKthQSort(vector<int>&a, int l, int r, int k)
{ int m = partition(a, l, r);
if(m - l + == k) return a[m];
else if(m - l + > k){
return findKthQSort(a, l, m - , k);//出现在前半段,因为算上第m个数依然>k个 所以要去掉第m个数,否则会死循环
}else{
return findKthQSort(a, m + , r, k - (m - l + )); //这个很重要,如果前面已经包含了(m - l + 1)个大的数,那么第k大的数将变成第k - (m - l + 1)大的数,且出现在后半段中
} } int findKth(vector<int> a, int n, int K) {
// write code here
return findKthQSort(a, , n - , K);
}

牛客网-3 网易编程题(1拓扑&2二叉树的公共最近祖先&3快排找第K大数)的更多相关文章

  1. [牛客网 -leetcode在线编程 -01] max-points-on-a-line -穷举

    题目及题目来源 链接:https://www.nowcoder.com/questionTerminal/bfc691e0100441cdb8ec153f32540be2 来源:牛客网 首页 > ...

  2. 牛客网第一场E题 Removal

    链接:https://www.nowcoder.com/acm/contest/139/E 来源:牛客网 Bobo has a sequence of integers s1, s2, ..., sn ...

  3. 【sql】牛客网练习题 (共 61 题)

    [1]查找最晚入职员工的所有信息 CREATE TABLE `employees` ( `emp_no` ) NOT NULL, `birth_date` date NOT NULL, `first_ ...

  4. [牛客网 -leetcode在线编程 -02] minimum-depth-of-binary-tree -树的最短深度

    题目描述 题目描述 Given a binary tree, find its minimum depth.The minimum depth is the number of nodes along ...

  5. JS-03 牛客网练习

    1.很多人都使用过牛客网这个在线编程网站,下面是自己做的该项所有练习,已通过网站和老师检查无误,分享给大家. 2.先说一下题目的位置:牛客网https://www.nowcoder.com/activ ...

  6. 牛客网_Go语言相关练习_判断&选择题(4)

    题目来源于牛客网 一.判断题 成员变量或者函数的首字母表示是否对外部可见. switch后面的声明语句和表达式语句都是可以选择的.例如: //可以什么都不加 switch: break; 错误指的是可 ...

  7. 牛客网练习赛18 A 【数论/整数划分得到乘积最大/快速乘】

    链接:https://www.nowcoder.com/acm/contest/110/A 来源:牛客网 题目描述 这题要你回答T个询问,给你一个正整数S,若有若干个正整数的和为S,则这若干的数的乘积 ...

  8. 链表中环的入口结点 牛客网 剑指Offer

    链表中环的入口结点 牛客网 剑指Offer 题目描述 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null. # class ListNode: # def __init__(se ...

  9. 重建二叉树 牛客网 剑指Offer

    重建二叉树 牛客网 剑指Offer 题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3, ...

随机推荐

  1. [bzoj3489]A simple rmq problem_KD-Tree

    A simple rmq problem 题目大意:给定一个长度为$n$的序列,给出$m$个询问:在$[l,r]$之间找到一个在这个区间里只出现过一次的最大的数. 注释:$1\le n\le 10^5 ...

  2. [bzoj5314][Jsoi2018]潜入行动_树形背包dp

    潜入行动 bzoj-5314 Jsoi-2018 题目大意:题目链接. 注释:略. 想法: 学长给我们除了一套考试题,三个学长一人一道这是T1. 好吧好吧,傻逼背包...... 复杂度$O(nk)$. ...

  3. Google Kaptcha验证码的使用

    原文:http://www.kailing.pub/article/index/arcid/92.html Kaptcha是什么? kaptcha 是谷歌开源的非常实用的验证码生成工具,基于Simpl ...

  4. firemonkey获取当前文件所在路径的方法

    在之前,我们知道有三种方法: ExtractFilePath(ParamStr(0)) ExtractFilePath(Application.ExeName) GetCurrentDir + '\' ...

  5. webpack 输出多个文件

    http://react-china.org/t/webpack/1870/2 webpack 文章 entry = { "button": "demo/button/i ...

  6. samba add new smbpasswd & recycle

    建立新账号(XXXXX)的范列: sudo useradd XXXXX -m   #建立本机用户且home下建文件夹 sudo smbpasswd XXXXX -a   #建立samba用戶且设定密码 ...

  7. linux c 获取当前执行进程总数

    获取当前执行进程总数的命令为: ps auxw | wc -l 获取当前执行进程总数的源代码例如以下: #include <stdio.h> #include <stdlib.h&g ...

  8. __init__、__str__、__del__方法

    1.def__init__()方法: class Cat: """定义了一个Cat类""" #初始化对象 def __init__(self ...

  9. HDU-4643-GSM(DFS)

    Problem Description Xiao Ming is traveling around several cities by train. And the time on the train ...

  10. iOS平台加入Google Admob -1/2(Unity3D开发之七)

    猴子原创,欢迎转载.转载请注明: 转载自Cocos2D开发网–Cocos2Dev.com.谢谢! 原文地址: http://www.cocos2dev.com/?p=567 Unity调用iOS还是非 ...