Как оптимизировать программу таким образом, чтобы она решалась за 1 секунду для любого массива?

Решаю задачу с помощью BFS, но не укладываюсь во время меньше 1s, когда получаемая строка состоит больше, чем из 10 000 символов.

Не знаю каким образом её можно оптимизировать.

Задача звучит так:

Отдыхая в деревне Пётр мысленно вернулся в детство и вспомнил одну из своих любимых компьютерных игр. В мире этой игры произошёл катаклизм, разорвавший его на множество островов летающих в космическом пространстве. Со временем острова расположились в пространстве ровным рядом, один за другим.

После катаклизма, осталось всего два способа путешествовать по миру:

  1. магические паромы, перемещающиеся между соседними островами (естественно, паром может двигаться в обе стороны), таким образом с острова, который стоит на і -ом месте в космическом ряду, можно попасть на і-1 и і+1 острова;
  2. порталы, через которые можно телепортироваться между островами независимо от расстояния, но только если до катаклизма эти острова составляли один материк (любопытно, что материки в этом мире имели не названия, а номера). Петру стало интересно, за какое минимальное количество перемещений можно добраться от первого острова до последнего. Помогите ему это выяснить (сам он всё ещё отдыхает).

Входные данные (поступают в стандартный поток ввода):

На вход вашей программе подаётся одна строка, содержащая массив целых чисел islands, где islands [i] - это числовое обозначение материка, к которому когда-то относился і-ый остров. Элементы в массиве расположены в том же порядке, что и острова в космическом пространстве. Причём -100 000 000≤islands[i]≤100 000 000, а количество островов n удовлетворяет условию 1≤n≤50 000. Все входные данные наших тестов всегда соблюдают указанные параметры, дополнительные проверки не требуются. Выходные данные (ожидаются в стандартном потоке вывода) Одно целое число, минимальное число шагов от первого острова до последнего.

Пример 1.

Ввод: 35225

Вывод: Простой пример для ознакомления с входными и выходными данными.

На вход подаются 5 островов. С первого острова можно попасть только на второй с помощью парома. Порталы использовать не получится, т.к. нет других островов носящих тот же номер материка. Со второго можно добраться на пароме обратно на первый или вперёд на третий. А также можно переместиться через портал на пятый (ведь они имеют один и тот же номер). Таким образом мы можем переместиться от первой ячейки до последней за два шага.

Мой код:

const readline = `require('readline').createInterface(process.stdin, process.stdout);`
readline.on('line', (line) => {
    const Array=line.trim().split(" ")
    const lenght=Array.length
    function hasDuplicates(array) {
        var valuesSoFar = [];
        for (var i = 0; i < a

Array.length; ++i) {
        var value = array[i];
        if (valuesSoFar.indexOf(value) !== -1) {
            return true;
        }
        valuesSoFar.push(value);
    }
    return false;
}

    let graf={}
    let m=[]

    
        function way(graf, start, end) {
            for(let i=0;i<Array.length;i++){
                const left=Array[i-1]
                const right=Array[i+1]
                const number=Array[i]
                if(left!==undefined){
                    m.push(${i-1})
                    graf[i]=m
                }
                if(right!==undefined){
                    m.push(${i+1})
                    graf[i]=m
                }    
                for(let y=0;y<Array.length;y++){
                    if(Array[i]===Array[y] && i!==y ){
                        m.push(${y})
                    }
                }
                m=[]
        }
            if(Array.length>0){
          const queue=[{node:start,path:[start]}]
          const visit={}
            while(queue.length>0){
                const {node,path}=queue.shift()
                if(visit[node]){
                    continue
                }
          visit[node]=true
          if(node===end){
            return Object.keys(path).length-1
          }
          for(const neihbor of graf[node]){
            if(!visit[neihbor]){
           queue.push({node:neihbor,path:[...path,neihbor]})
            }
           
          }
    } return null}
    else{
        return 0
    }}
  
    const a=hasDuplicates(Array)

    let result
    if(a){
        result=way(graf,"0",${lenght-1});
    }
    else{
        result=Array.length-1
    }
   console.log(result);
    readline.close()
}).on('close', () => process.exit(0));

Ответы (0 шт):