Как оптимизировать программу таким образом, чтобы она решалась за 1 секунду для любого массива?
Решаю задачу с помощью BFS, но не укладываюсь во время меньше 1s, когда получаемая строка состоит больше, чем из 10 000 символов.
Не знаю каким образом её можно оптимизировать.
Задача звучит так:
Отдыхая в деревне Пётр мысленно вернулся в детство и вспомнил одну из своих любимых компьютерных игр. В мире этой игры произошёл катаклизм, разорвавший его на множество островов летающих в космическом пространстве. Со временем острова расположились в пространстве ровным рядом, один за другим.
После катаклизма, осталось всего два способа путешествовать по миру:
- магические паромы, перемещающиеся между соседними островами (естественно, паром может двигаться в обе стороны), таким образом с острова, который стоит на і -ом месте в космическом ряду, можно попасть на і-1 и і+1 острова;
- порталы, через которые можно телепортироваться между островами независимо от расстояния, но только если до катаклизма эти острова составляли один материк (любопытно, что материки в этом мире имели не названия, а номера). Петру стало интересно, за какое минимальное количество перемещений можно добраться от первого острова до последнего. Помогите ему это выяснить (сам он всё ещё отдыхает).
Входные данные (поступают в стандартный поток ввода):
На вход вашей программе подаётся одна строка, содержащая массив целых чисел 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));