[ [start,a,b], [c,d,e], [f,g,end] ]Unique path:
[start, a,b,e,end]
[start,c,f,g,end]
[start,q,d,g,end]
2. Implementation
Thought 1 recursive
Q1: how to start ?
A1: start from right or down
Q1: how to make sure unique?
A1: since at every point we only have option to move right or down, so there is no chance to move back to already explored point
Q1: hot to stop?
A1: when you hit the right-bottom corner the point (m-1, n-1), we stop
Thought 2 permutation and combination mathematics
top-left to bottom-right needs m+n steps to travel
Within m+n steps, there must be m step belong to down move and n steps belong to right move.
Take down move or right move first, Use Mathematics, given m+n steps, take m belong to down,
assume m = 3 and n = 7, we can take step 1, 4, 6 as down and the rest are right
Cn r = n! / (n-r)! *r!
Q1: how to calculate r! ?
A1: r1 = 1x2x3x..r, use factorial
Q1: any fast way to calculate C n r ?
A1: C nr = (r+1)x(r+2)..xn / 1x2x3x..(n-r)
// Time:O(min(m,n)), Space:O(1)
public int uniquePaths(int m, int n)
{
//Cnr = nx..x(n-r) / 1x2x..xr
double num = 1;
double denom = 1;
// NOTE: already at (0,0) choose m-1 and n-1
big = (m>n)?m-1:n-1;
small = (m>n)?n-1:m-1;
for (int i =1 ; i <= small;i++)
{
denom *=i;
num*= (small + big -1) - i;
}
return (int) num/denom;
}
// Time:O(2^n), Space:O(n) Time Exceed Limit
public int uniquePaths(int m, int n)
{
// validate the input
if (m == 0 || n == 0)
{
return 0;
}
int[] res = new int[2];
helper(0,0, m,n,res);
return res[0];
}
//private void helper (int i, int j,int m, int n, int[] res)
private int helper (int i, int j,int m, int n)
{
// base case to stop
if (i == m-1 && j == n-1)
{
//res[0]++;
//return;
return 1;
}
//if (i==m || n = n)
if (i > m-1 || j > n-1)
{
//return;
return 0;
}
// recursive call (any check condition)
//if ( i < m-1)
// helper(i+1,j,m,n,res);
//if ( j < n-1)
// helper(i, j+1,m,n,res);
return helper(i+1,j,m,n) + helper(i,j+1,m,n);
}
helper(0,0,..)
helper(1,0,..)
helper(2,0,..)
..
helper(m-1,0,..)
retrun;
helper(m-1,1,..)
helper(m-1,2,..)
..
helper(m-1, n-1,..)
count++
return
helper(m-1, n-2,..)
WHEN BACKTRACKING, no way to stop it
assume m =4 n =4
helper(0,0,..)
helper(1,0) + helper(0,1,.)
helper(2,0) + helper(1,1) h(1,1)+ h(0,2)
h(3,0)+ h(2,1) h(2,1)+ h(1,2) h(2,1)+h(1,2) h(1,2)+h(0,3)
h(3,1)+h(2,2) h(3,1)+h(2,2) h(2,2)+h(1,3) h(2,2)+h(1,3)
h(3,2)+h(2,3)
h(4,2)+h(3,3) h(3,3)+h(2,4)
3. Similar Ones(M) Unique Path II
(M) Minimum Path Sum
(H) Dungeon Game
Path Sum
Path SumII
Binary Tree Maximum Path Sum
No comments:
Post a Comment