481просмотров
7.1%от подписчиков
22 марта 2026 г.
statsScore: 529
Задача: 1057. Campus Bikes
Сложность: medium В городке, изображенном на плоскости X-Y, есть n рабочих и m велосипедов, причем n <= m. Вам дан массив workers длины n, где workers[i] = [xi, yi] - положение i-го рабочего. Вам также дан массив bikes длины m, где bikes[j] = [xj, yj] - позиция j-го велосипеда. Все заданные позиции уникальны. Назначаем велосипед каждому работнику. Среди доступных велосипедов и работников мы выбираем пару (workeri, bikej) с наименьшим манхэттенским расстоянием между ними и назначаем велосипед этому работнику. Если существует несколько пар (workeri, bikej) с одинаковым наименьшим манхэттенским расстоянием, мы выбираем пару с наименьшим индексом работника. Если существует несколько способов сделать это, мы выбираем пару с наименьшим индексом велосипеда. Повторяем этот процесс до тех пор, пока не останется свободных работников. Возвращаем массив answer длины n, где answer[i] - индекс (с индексом 0) велосипеда, на который назначен i-й работник. Манхэттенское расстояние между двумя точками p1 и p2 равно Manhattan(p1, p2) = |p1.x - p2.x| + |p1.y - p2.y|. Пример:
Input: workers = [[0,0],[2,1]], bikes = [[1,2],[3,3]]
Output: [1,0] 👨💻 Алгоритм: 1⃣Для каждой пары (работник, велосипед) вычисли Манхэттенское расстояние и сохрани все пары вместе с расстоянием в список. 2⃣Отсортируй список пар по расстоянию, а затем по индексу работника и велосипеда.
Назначь велосипеды работникам, следуя отсортированному списку пар и отслеживая, какие работники и велосипеды уже были использованы. 3⃣Заполни и верни массив назначений. 😎 Решение:
import java.util.*; public class Solution { public int[] assignBikes(int[][] workers, int[][] bikes) { List<int[]> pairs = new ArrayList<>(); for (int i = 0; i < workers.length; i++) { for (int j = 0; j < bikes.length; j++) { int distance = Math.abs(workers[i][0] - bikes[j][0]) + Math.abs(workers[i][1] - bikes[j][1]); pairs.add(new int[]{distance, i, j}); } } pairs.sort((a, b) -> { if (a[0] != b[0]) return a[0] - b[0]; if (a[1] != b[1]) return a[1] - b[1]; return a[2] - b[2]; }); int[] result = new int[workers.length]; boolean[] bikeTaken = new boolean[bikes.length]; boolean[] workerAssigned = new boolean[workers.length]; Arrays.fill(result, -1); for (int[] pair : pairs) { int workerIdx = pair[1]; int bikeIdx = pair[2]; if (!workerAssigned[workerIdx] && !bikeTaken[bikeIdx]) { result[workerIdx] = bikeIdx; bikeTaken[bikeIdx] = true; workerAssigned[workerIdx] = true; } } return result; }
} Ставь 👍 и забирай 📚 Базу знаний