Java

Превышен лимит времени | Задача Minimum Path Sum на LeetCode | 60 / 61 testcases passed

Текст:
Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right, which minimizes the sum of all numbers along its path.

Пример:Вход: grid = [[1,3,1],[1,5,1],[4,2,1]]
Выход: 7

Мой код проходит все тесты кроме последней и выдаёт Time Limit Exceeded.
 class Solution { 
private int minPath = Integer.MAX_VALUE;

private int minPathSum(int[][] grid, int currentSum, int i, int j) {
if (currentSum > minPath)
return minPath;
if (i == grid.length - 1 && j == grid[0].length - 1) {
minPath = currentSum;
return minPath;
}
int right = Integer.MAX_VALUE, bottom = Integer.MAX_VALUE;
if (i < grid.length - 1)
bottom = minPathSum(grid, currentSum + grid[i + 1][j], i + 1, j);
if (j < grid[0].length - 1)
right = minPathSum(grid, currentSum + grid[i][j + 1], i, j + 1);
return right > bottom ? bottom : right;
}

public int minPathSum(int[][] grid) {
return minPathSum(grid, grid[0][0], 0, 0);
}
}
Ну правильно, ты навертел алгоритм экспоненциальной сложности, а литкод тебе скормил массивчик размерностью 100500. "Кряк" - сказала японская бензиновая пила.

Вот тебе решение линейной сложности от количества ячеек в матрице, O(m * n):
 import static java.lang.Math.min;

class Solution {
public int minPathSum(int[][] grid) {
int[][] minPaths = new int[grid.length][];
minPaths[0] = new int[grid[0].length];
minPaths[0][0] = grid[0][0];
for (int j = 1; j < grid[0].length; j++) {
minPaths[0][j] = grid[0][j] + minPaths[0][j - 1];
}
for (int i = 1; i < grid.length; i++) {
minPaths[i] = new int[grid[i].length];
minPaths[i][0] = grid[i][0] + minPaths[i - 1][0];
for (int j = 1; j < grid[i].length; j++) {
minPaths[i][j] = grid[i][j] + min(minPaths[i][j - 1], minPaths[i - 1][j]);
}
}
int[] lastRow = minPaths[minPaths.length - 1];
return lastRow[lastRow.length - 1];
}
}

Смотри, у тебя "лаконичный" рекурсивный алгоритм, а у меня - динамическое программирование, да ещё с вынесенной отдельно нулевой итерацией. А количество строк кода - одинаковое. Вот что значит не писать лишнего.

В Яндекс, что ли, собеседуешься? Они любят из литкода тесты давать на время. А потом определять успешно прошедшего их кандидата менять местами кнопки в яндекс-маркете.
Владимир Бойко
Владимир Бойко
54 053
Лучший ответ
Андрей Кодаш Спасибо за ответ. У вас видимо есть опыт работы в Яндексе :)
честно говоря, текст задания и пример ввода/вывода не стыкуются...
ответ даётся в виде минимальной суммы элементов по какому-то пути... разве это одно и то же?...
MY
Muzaffar Yusupov
82 984
Один из способов улучшения эффективности вашего кода - использование динамического программирования. Этот подход включает разбиение проблемы на меньшие подзадачи и сохранение результатов этих подзадач, чтобы избежать их пересчета. Это может значительно сократить временную сложность вашего решения.
Евгений Лобков
Евгений Лобков
25 860