я наткнулся на этот вопрос на InterviewBit:Какое худшее время для этого кода O (R * C)?
int memo[101][101];
int findMinPath(vector<vector<int> > V, int r, int c) {
int R = V.size();
int C = V[0].size();
if (r >= R || c >= C) return 100000000; // Infinity
if (r == R - 1 && c == C - 1) return 0;
if (memo[r][c] != -1) return memo[r][c];
memo[r][c] = V[r][c] + min(findMinPath(V, r + 1, c), findMinPath(V, r, c + 1));
return memo[r][c];
}
Callsite :
memset(memo, -1, sizeof(memo));
findMinPath(V, 0, 0);
Предположим R = V.size()
и C = V[0].size()
и V
имеет положительные элементы
Не будет ли код создания бинарного дерева рода вызов функции, которая принимает O (2 (m + n)), так как каждый вызов функции вызывает два других вызова функций?
Да, но для каждого r + 1 вы также получаете c и c + 1. –
Не ответ, но следите за тем, что происходит! Это может показаться правдоподобным, но если вы попытаетесь инициализировать «памятку» примерно на все, кроме 0 или -1, то это будет ужасно неправильно. – user2357112
@ user2357112: И даже '-1' не будет работать на своих системах дополнений, если вы когда-нибудь столкнетесь с одним (у меня никогда не было сомнений, что я когда-либо буду, но хорошо придерживаться определенных стандартами поведения). – ShadowRanger