Итак, это проблема.
Учитывая массив целых чисел, вернуть новый массив, где каждый элемент в новом массиве - это количество меньших элементов справа от этого элемента в исходном входном массиве .
Например, для массива [3, 4, 9, 6, 1] return [1, 1, 2, 1, 0], поскольку:
There is 1 smaller element to the right of 3
There is 1 smaller element to the right of 4
There are 2 smaller elements to the right of 9
There is 1 smaller element to the right of 6
There are no smaller elements to the right of 1
I придумал этот алгоритм с двумя указателями.
function lessThan(arr) {
let results = [];
let i = 0;
let j = arr.length - 1;
let count = 0;
while (i < arr.length) {
if (arr[i] > arr[j]) {
count++;
}
j--;
if (j === 1) {
results.push(count);
count = 0;
i++;
j = arr.length - 1;
}
}
return results;
}
указатель «i» будет начинаться в начале, а «j» - в конце. если 'j' равно 1. 'i' увеличивается, а 'j' сбрасывается до конца. Это продолжается до тех пор, пока «i» не достигнет конца массива (когда «i» больше или равно arr.length, время l oop прерывается). В соответствии с тем, что я знаю о временной сложности. Я предполагаю, что мы go через массив только один раз, когда это O (n). Но не должны ли мы учитывать тот факт, что существует n сравнений, сделанных по отношению к j, когда мы go проходим через? Я новичок в соревновательном программировании и нотации Big O. Пожалуйста, помогите мне.
Спасибо.