Какова временная сложность кода, указанному ниже? Я знаю, что он имеет рекурсивный вызов несколько раз, поэтому он должен, вероятно, быть 3^n, но все же каждый раз он инициализирует массив длины n, который используется последним, и это меня смущает. Какая должна быть временная сложность, если мы добавим дополнительный массив для применения memoization? Это ниже - решение для задачи Hackerrank Java 1D Array (Hard).Как рассчитать временную сложность рекурсий с помощью memoization?
public static boolean solve(int n, int m, int[] arr, boolean[] visited, int curr) {
if (curr + m >= n || curr + 1 == n) {
return true;
}
boolean[] newVisited = new boolean[n];
for (int i = 0; i < n; i++) {
newVisited[i] = visited[i];
}
boolean s = false;
if (!visited[curr+1] && arr[curr+1] == 0) {
newVisited[curr+1] = true;
s = solve(n,m,arr,newVisited,curr+1);
}
if (s) {
return true;
}
if (m > 1 && arr[curr+m] == 0 && !visited[curr+m]) {
newVisited[curr+m] = true;
s = solve(n,m,arr,newVisited,curr+m);
}
if (s) {
return true;
}
if (curr > 0 && arr[curr-1] == 0 && !visited[curr-1]) {
newVisited[curr-1] = true;
s = solve(n,m,arr,newVisited,curr-1);
}
return s;
}