Я не читал другие ответы просто потому, что я хочу отдать его самому.
Давайте итеративно улучшим наше решение.
Наш анализ с точки зрения времени и пространства сложности потребуется нам сформулировать несколько вещей явно на первом:
Пусть
N = length of string
M = numbers of characters in alphabet
Brute алгоритм силы, чтобы пересечь строку и для каждого элемента строки мы ищем для его чтобы увидеть, есть ли у него дубликат.
Время Сложность: O (N 2 )
Space Сложность: O (1)
Можем ли мы сделать лучше?
Конечно, мы можем пройти через строку и сделать подсчет много раз персонаж appears.Make другой обход через строку, чтобы найти первый символ, который имеет подсчитывать 1.
Временная сложность: O (N + M)
Space Сложность : O (M)
Почему это O (N + M)?
Поскольку нам нужно сначала инициализировать элементы массива count. Так же, даже если ввод «a», нам нужно инициализировать массив count для M элементов.
Можем ли мы сделать лучше?
Сначала давайте заявим интервьюеру, что эта задача - Омега (N), просто потому, что мы должны видеть каждый элемент строки по крайней мере один раз. Исследуйте это, увидев входной экземпляр «aaaaaaz»
. Поэтому мы не стремимся улучшите нашу сложность во времени, просто сделав фактическое время работы лучше, выполнив всего один обход строки.
Это действительно возможно.
for(int i=0;i<N;i++)
{
if(visited[i]==-2)continue;
if(visited[i]==-1)visited[i]=i;continue;
visited[i]=-1;
}
int F=N;
char res=' ';
for(int i=0;i<M;i++)
{
if(visited[i]>=0)
{
F=min(F,visited[i]);
res=A[visited[i]];
}
}
return res;
Время Сложность: O (N + M)
Space Сложность: O (M)
Можем ли мы сделать лучше?
Можем ли мы сделать это в O (N), возможно?
Я все еще думаю о способе сделать это в истинном O (N) .IF Я нахожу решение, я обновлю этот ответ.
Ключевое слово «first» – banuj
@JanDvorak: принятый ответ на связанный вопрос очень низок, так что вопрос по сути невозможен. –
@ н.м. Как так? исходный код является довольно читаемым IMO –