Этот вопрос задавали мне в онлайн-тесте. В карте декартовой плоскости имеется N точек. Будет задано целое число K. Цель состоит в том, чтобы найти площадь квадрата (минимум), вмещающую не менее K точек. Стороны квадрата должны быть параллельны оси. Вершины квадрата должны быть целыми числами. Любые точки, лежащие по бокам, не считаются внутри квадрата.Площадь с минимальной площадью, охватывающей K баллов среди заданных N баллов
Я мог бы решить его только для K = N (то есть все точки лежат в квадрате).
Мое решение -
static int minarea(int[] x, int[] y, int k) {
//Find max y
int maxVal = Integer.MIN_VALUE;
for(int i : y){
if(i > maxVal){
maxVal = i;
}
}
//Find min y
int minVal = Integer.MAX_VALUE;
for(int i : x){
if(i < minVal){
minVal = i;
}
}
int yLength = (maxVal-minVal)+2;
//Find max x
maxVal = Integer.MIN_VALUE;
for(int i : x){
if(i > maxVal){
maxVal = i;
}
}
//Find min x
minVal = Integer.MAX_VALUE;
for(int i : x){
if(i < minVal){
minVal = i;
}
}
int xLength = (maxVal-minVal)+2;
int sqSide = (yLength > xLength)?yLength:xLength;
return sqSide*sqSide;
}
Одним из подходов к общему решению было бы найти все возможные комбинации точек K среди N точек и описанной выше методики для всех комбинаций, но это не является хорошим. Пожалуйста, порекомендуйте.
Вы можете взять статистический подход и вычислить стандартное отклонение каждой из точек вдоль х и ось y, затем удалите первые N-K-точки с самым высоким стандартным отклонением. –
Вам нужно найти квадрат, охватывающий не менее 'K' точек или точно' K' точек? –
Я действительно не помню вопроса, но это должно быть как минимум. Изменит и вопрос. – Ouney