Ваш алгоритм хорош.
Лучше «лаконичного» тем, что не занимается сортировкой там, где это не нужно.
Представьте массив
[1, 2, 1000, 1001,...]
далее все 100500 элементов больше 1000.
Совсем незачем сортировать весь этот максимальный хвост между собой, когда интересуют только минимальные значения.
Вот
разбор проблемы поиска двух наименьших значений в массиве. Там ешё предлагается вариант в 2 прохода по массиву: найти наименьшее, и вторым проходом найти наименьшее, большее найденного. Тоже O(n), но можно и за 1 проход, как вы и предложили.
вариант
Без пересоздания массива. Держать две переменные, значения, которых по возрастанию. Максимум две проверки условий на итерации.
const sumTwoSmallestNumbers = arr => {
let a = arr[0];
let b = arr[1];
if (a > b) {
[a, b] = [b, a];
}
for (let i = 2; i < arr.length; i++) {
const v = arr[i];
if (v < a) {
b = a;
a = v;
} else if (v < b) {
b = v;
}
}
return a + b;
};
sumTwoSmallestNumbers([55, 44, 1, 99, 2]); // 3