977. Squares of a Sorted Array#51
Conversation
Что вот это за числа? У тебя есть |
Мне кажется странным, что ты всюду пытаешься использовать bucket sort. Помни, что это не бесплатно — массив получается сильно разреженным, тратится память. |
|
В принципе, решение валидное, но требует O(n) дополнительной памяти (если использовать мапу, а не bucket sort, если же использовать его — то O(m), где m максимальное значение элемента в массиве, наверное, в своей оценке ты это имел в виду. Что, кстати говоря, может быть довольно большим числом, а-ля 10^9 степени и вот ты уже сжираешь мегабайты памяти не понятно зачем). Давай сделаем без дополнительной памяти, выходной массив для результата за дополнительную память не считаем. |
Ну научился пользоваться молотком...теперь все гвозди:) Мне понравилась идея бакетсорта:) По поводу мапы, получается , это же тоже память? Объект я заветси не могу, так как значения повторяются. new Map - можно, но память, но меньше. Экономлю на памяти, трачу на цикл. |
Не, я имею в виду массива ( |
|
Вывод такое: если тебе нужен хэш-мап — используй |
|
В любом случае, это решение тоже с дополнительной память. Здесь можно совсем без этого. Обрати внимание, что значения в массиве отсортированы. Это значит есть некоторая точка в этом массива, которая даст первый элемент в массиве квадратов, можешь сказать вообще говоря что это за точка, что за значение? |
По идея я могу взять серидину массива и это сразу будет старт. |
Тут согласен. hash подходит, просто я не сразу сообразил как в нем хранить одинаковые значения? |
А в массиве разве может быть? В чем разница? |
Да, идея верная. Только не понятно почему «середину». Пример: [-2,-1,0,1,2,3,4,5,6]. Почему я должен взять 2 (середину)? |
Тогда понял. Получается я сначапла собираю числа с их кол-вом ключ число - значение кол-во. |
Тогда 0 получается. |
Именно, да. Не обязательно ноль, но минимальное число, там нуля может и не быть. И расходиться двумя указателями от минимума, собирая всё в результат. |
|
@vitkarpov |
|
А какой тут алгоритм у тебя получается? Мне кажется, что надо сделать шаг назад и просто словами написать, что хочешь. Я бы как-то так делал (псевдокод, пишу с листа, не запускал): const indexOfMin = findIndexOfMin(arr);
let left = indexOfMin;
let right = indexOfMin;
while (left >= 0 || right < arr.length) {
const sqrLeft = arr[left] ** 2;
const sqrRight = arr[right] ** 2;
if (sqrLeft < sqrRight) {
res.push(srqLeft);
left > 0 && left--;
} else {
res.push(srqRight);
right < arr.length - 1 && right++;
}
}Наверняка, здесь что-нибудь упадёт, но я хочу показать идею. |
|
Пока твой код мне сложно понять 😄 |
|
Т.е. ещё раз в чем идея алгоритма:
Сложность при этом O(n) т.к. каждый элемент массива может быть обработан только один раз |
|
@vitkarpov Твою тоже не смог реализовать, когда один указатель ведешь. Там проблема с тем, что ты просто в одну сторону уходишь. Пока не нашел решение... |
Решение через bucket sort. Отсортиовал, а потом просто возвел в степень.
Сложность O(n) и по памяти получается O(n + m + k)
n это входящий массив
m - это хешмапа
k - это возвращаемый массив