Forwarded from Art of Code
Задача с собеса в Yandex
Напишите код, который вернёт медиану из трёх чисел. Уточните определение медианы, если человек не знает.
Решение:
#include <algorithm>
int median3(int v1, int v2, int v3) {
int arr[] = {v1, v2, v3};
std::sort(arr, arr + 3);
return arr[1];
}
@codeof_art
Напишите код, который вернёт медиану из трёх чисел. Уточните определение медианы, если человек не знает.
//Интерфейс
int median3(int v1, int v2, int v3)
{
//реализация
}
assert(3 == median(2,5,3))
assert(2 == median3(2,2,1))
Решение:
int median3(int v1, int v2, int v3) {
int arr[] = {v1, v2, v3};
std::sort(arr, arr + 3);
return arr[1];
}
@codeof_art
🗿65🤣35👍2😁2🙉2❤1🔥1
Задача с собеседования в Яндекс
Дано бинарное дерево (не поиска):
struct Node {
Node* parent;
Node* left;
Node* right;
}
Нужно написать функцию, которая для двух данных вершин будет возвращать их наименьшего (ближайшего) общего предка:
Node* lca(Node* a, Node* b);
Ограничения: память O(1)
НАШ ЧАТ АЛГОРИТМИСТОВ
Решение:
Считаем глубину для каждой вершины, потом идем двумя указателями вверх от вершин, пока они не встретятся. O(h) по времени, где h - высота дерева.
#include <unordered_map>
struct Node {
Node* parent;
Node* left;
Node* right;
};
std::unordered_map<Node*, int> depth_map;
void compute_depths(Node* node, int depth = 0) {
if (!node) return;
depth_map[node] = depth;
if (node->left) {
node->left->parent = node;
compute_depths(node->left, depth + 1);
}
if (node->right) {
node->right->parent = node;
compute_depths(node->right, depth + 1);
}
}
Node* lca(Node* a, Node* b) {
int da = depth_map[a];
int db = depth_map[b];
while (da > db) {
a = a->parent;
--da;
}
while (db > da) {
b = b->parent;
--db;
}
while (a != b) {
a = a->parent;
b = b->parent;
}
return a;
}
@algoses
Дано бинарное дерево (не поиска):
struct Node {
Node* parent;
Node* left;
Node* right;
}
Нужно написать функцию, которая для двух данных вершин будет возвращать их наименьшего (ближайшего) общего предка:
Node* lca(Node* a, Node* b);
Ограничения: память O(1)
НАШ ЧАТ АЛГОРИТМИСТОВ
Решение:
struct Node {
Node* parent;
Node* left;
Node* right;
};
std::unordered_map<Node*, int> depth_map;
void compute_depths(Node* node, int depth = 0) {
if (!node) return;
depth_map[node] = depth;
if (node->left) {
node->left->parent = node;
compute_depths(node->left, depth + 1);
}
if (node->right) {
node->right->parent = node;
compute_depths(node->right, depth + 1);
}
}
Node* lca(Node* a, Node* b) {
int da = depth_map[a];
int db = depth_map[b];
while (da > db) {
a = a->parent;
--da;
}
while (db > da) {
b = b->parent;
--db;
}
while (a != b) {
a = a->parent;
b = b->parent;
}
return a;
}
@algoses
🔥4🏆3❤1