请告诉我如何解决这个图形问题:
条款:
给定一个整数数组 (
-100 000 000 ≤ arr[i] ≤ 100 000 000
)。您可以在数组中向前和向后移动一步(
i - 1
或i + 1
)。您还可以一步在任意方向上在数组中移动相同的数字。
任务:
求从第一个数字到最后一个数字的最少步数。
输入数据:
n
输入是一个字符串,其中包含长度为(1 ≤ n ≤ 50 000
) 的整数数组
示例1:
输入:
4 6 3 3 6
结论:
2
解释:
从第一个数字 (
4
) 只能到达第二个数字 (6
)。您可以从第二个 (6
) 移动到第五个 (6
),因为数字相同。最少步数:
2
.示例2:
输入:
31 -6 -6 21 31 8 8 8 5 21
结论:
3
解释:
从第一个 (
31
) 移动到第五个 (31
),然后退到第四个 (21
),然后到最后一个 (21
)。实施例3:
输入:
7 6 1 6 1 6 1 7
结论:
1
解释:
从第一个 (
7
) 开始,我们移动到最后一个 (7
)。
我在 中编写了以下代码NodeJS
,但是由于超出了执行时间限制,响应没有通过沙箱:
const readline = require('readline').createInterface(process.stdin, process.stdout);
function connect(graph, i, j) {
graph[i].push(j);
graph[j].push(i);
}
readline.on('line', (line) => {
const islands = line.trim().split(' ').map(Number);
const n = islands.length;
// Создание графа
const graph = Array.from({ length: 2 * n - 1 }, () => []);
// Подключение соседних островов
for (let j = 0; j < 2 * n - 2; ++j) {
connect(graph, j, j + 1);
}
// Создание порталов (материков)
const continents = new Map();
for (let i = 0; i < n; ++i) {
const c = islands[i];
if (!continents.has(c)) {
continents.set(c, graph.length);
graph.push([]);
}
connect(graph, 2 * i, continents.get(c));
}
const distance = new Array(graph.length).fill(0);
const queue = [0]; // Можно использовать массив как очередь
// BFS
while (queue.length > 0) {
const j = queue.shift(); // Извлекаем первый элемент очереди
if (j === 2 * n - 2) {
break;
}
for (const k of graph[j]) {
if (distance[k] === 0) {
distance[k] = distance[j] + 1;
queue.push(k);
}
}
}
console.log(String(distance[2 * n - 2] / 2));
readline.close();
}).on('close', () => process.exit(0));
有人可以帮忙优化解决方案吗?