Skip to content

Commit c62f821

Browse files
authored
Create Q-05: Minimum Falling Path Sum.java
1 parent 3b0b089 commit c62f821

File tree

1 file changed

+127
-0
lines changed

1 file changed

+127
-0
lines changed
Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
/*
2+
931. Minimum Falling Path Sum
3+
Medium
4+
5+
Given an n x n array of integers matrix, return the minimum sum of any falling path through matrix.
6+
A falling path starts at any element in the first row and chooses the element in the next row that is
7+
either directly below or diagonally left/right. Specifically,
8+
the next element from position (row, col) will be (row + 1, col - 1), (row + 1, col), or (row + 1, col + 1).
9+
10+
11+
12+
Example 1:
13+
Input: matrix = [[2,1,3],[6,5,4],[7,8,9]]
14+
Output: 13
15+
Explanation: There are two falling paths with a minimum sum as shown.
16+
17+
Example 2:
18+
Input: matrix = [[-19,57],[-40,-5]]
19+
Output: -59
20+
Explanation: The falling path with a minimum sum is shown.
21+
22+
23+
Constraints:
24+
25+
n == matrix.length == matrix[i].length
26+
1 <= n <= 100
27+
-100 <= matrix[i][j] <= 100
28+
*/
29+
class Solution {
30+
static int[][] memo;
31+
public int minFallingPathSum(int[][] matrix) {
32+
33+
int n = matrix.length;
34+
if (n == 1) return matrix[0][0];
35+
//-100 <= matrix[i][j] <= 100
36+
memo = new int[n+1][n+1];
37+
Arrays.stream(memo).forEach(a->Arrays.fill(a,Integer.MAX_VALUE));
38+
// int mini = Integer.MAX_VALUE;
39+
// for(int i=0;i<n;i++){
40+
// mini = Math.min(mini , solveRec(0,i,n,matrix));
41+
// }
42+
//return mini;
43+
44+
return solveTab(matrix);
45+
46+
//return solveOpt(matrix);
47+
}
48+
public int solveRec(int i,int j,int n,int[][] matrix){
49+
//base case ::
50+
if(i==n){
51+
return 0;
52+
}
53+
if(memo[i][j]!=Integer.MAX_VALUE){
54+
return memo[i][j];
55+
}
56+
57+
int left =Integer.MAX_VALUE,right=Integer.MAX_VALUE;
58+
if(j>0){
59+
left = solveRec(i+1,j-1,n,matrix);
60+
}
61+
int center = solveRec(i+1,j,n,matrix);
62+
if(j<n-1){
63+
right = solveRec(i+1,j+1,n,matrix);
64+
}
65+
return memo[i][j] = matrix[i][j] + Math.min(left,Math.min(center,right));
66+
}
67+
public int solveTab(int[][] matrix){
68+
int n = matrix.length;
69+
int[][] tab = new int[n][n];
70+
71+
for(int i=0;i<n;i++){
72+
tab[0][i] = matrix[0][i];
73+
}
74+
75+
for(int i=1;i<n;i++){
76+
for(int j=0;j<n;j++){
77+
int left =Integer.MAX_VALUE,right=Integer.MAX_VALUE;
78+
if(j>0){
79+
left = tab[i-1][j-1];
80+
}
81+
int center = tab[i-1][j];
82+
if(j<n-1){
83+
right = tab[i-1][j+1];
84+
}
85+
tab[i][j] = matrix[i][j] + Math.min(left,Math.min(center,right));
86+
}
87+
}
88+
89+
int maxi = Integer.MAX_VALUE;
90+
for (int j = 0; j < n; j++) {
91+
maxi = Math.min(maxi, tab[n - 1][j]);
92+
}
93+
94+
return maxi;
95+
}
96+
public int solveOpt(int[][] matrix){
97+
int n = matrix.length;
98+
int[] prev = new int[n];
99+
100+
for(int i=0;i<n;i++){
101+
prev[i] = matrix[0][i];
102+
}
103+
104+
for(int i=1;i<n;i++){
105+
int[] temp = new int[n];
106+
for(int j=0;j<n;j++){
107+
int left =Integer.MAX_VALUE,right=Integer.MAX_VALUE;
108+
if(j>0){
109+
left = prev[j-1];
110+
}
111+
int center = prev[j];
112+
if(j<n-1){
113+
right = prev[j+1];
114+
}
115+
temp[j] = matrix[i][j] + Math.min(left,Math.min(center,right));
116+
}
117+
prev = temp;
118+
}
119+
120+
int maxi = Integer.MAX_VALUE;
121+
for (int j = 0; j < n; j++) {
122+
maxi = Math.min(maxi, prev[j]);
123+
}
124+
125+
return maxi;
126+
}
127+
}

0 commit comments

Comments
 (0)