Прежде всего, тот факт, что это двумерный массив, не имеет значения в этом контексте; вы хотите найти дубликаты по всему массиву, так что в любом случае вам лучше использовать одномерную индексацию. По совпадению, это предложенный способ обработки двумерных массивов в C ++.
Итак, если вы можете расположить индексы в некотором порядке, общая идея состоит в проверке каждого элемента со всеми последующими элементами. Это даст вам O (n 2 ) . Неудивительно, что псевдокод представляет собой две петли и является общей схемой, используемой, например, для обнаружения столкновений:
for (iterA = 0; iterA < num - 1; iterA++) {
for (iterB = iterA + 1; iterB < num; iterB++) { // note how iterB starts one further
if (*iterA == *iterB)
return true; // found a duplicate
}
}
В случае двумерного массива разыменование *iterA
может быть заменено функцией, которая разбивает составной одномерный индекс на две составляющие, например, с i % width, i / width
. Это, опять же, очень распространенный паттерн.
Как говорится, зачем? Сделайте std::set
, начните помещать элементы один за другим и вызывайте find
перед каждой вставкой. Если find
что-то возвращает, сломайте.