문제 URL :https://leetcode.com/problems/longest-increasing-path-in-a-matrix/
Longest Increasing Path in a Matrix - LeetCode
Can you solve this real interview question? Longest Increasing Path in a Matrix - Given an m x n integers matrix, return the length of the longest increasing path in matrix. From each cell, you can either move in four directions: left, right, up, or down.
leetcode.com
접근법: 2차원배열에서 자신보다 큰숫자를 넘어갈수있을때
그경로에서 가장긴 경로를 찾는문제입니다.
2가지 풀이가 가능합니다.
방법 1:
처음 풀었을땐 다익스트라처럼 이용하게 풀게됐습니다.
모든 경로의 시작점의 길이를 1로 정하고 시작하고 근처에 자신보다 큰 숫자가 있고
거리가 길어지는대로 탐색을 시작합니다.
소스코드 1:
class Solution {
public:
int check[200][200];
int dy[4]={-1,0,1,0};
int dx[4]={0,1,0,-1};
int n,m;
bool isrange(int y,int x){
return 0<=y&&y<n&&0<=x&&x<m;
}
int dijkstra(vector<vector<int>>& matrix){
priority_queue<tuple<int,int,int,int>> pq;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
pq.push({-1,-matrix[i][j],i,j});
check[i][j]=1;
}
}
int res =0;
while(!pq.empty()){
int dis,num,y,x;
tie(dis,num,y,x)=pq.top();
dis=-dis;
num=-num;
pq.pop();
res=max(res,dis);
if(check[y][x]>dis)continue;
for(int i=0;i<4;i++){
int ny=y+dy[i];
int nx=x+dx[i];
int ndis = dis+1;
if(isrange(ny,nx)&&num<matrix[ny][nx]){
if(ndis>check[ny][nx]){
pq.push({-ndis,-matrix[ny][nx],ny,nx});
check[ny][nx]=ndis;
}
}
}
}
return res;
}
int longestIncreasingPath(vector<vector<int>>& matrix) {
int res=0;
n=matrix.size();
m=matrix[0].size();
return dijkstra(matrix);
}
};
방법 2: dfs를 이용하여 메모이제이션 기법으로 더 빠르게 풀수도있습니다.
소스코드 :
class Solution {
public:
int dp[200][200];
int dy[4]={-1,0,1,0};
int dx[4]={0,1,0,-1};
int n,m;
bool isrange(int y,int x){
return 0<=y&&y<n&&0<=x&&x<m;
}
int dfs(vector<vector<int>> &matrix,int y,int x){
int &cache=dp[y][x];
if(cache!=-1)return cache;
cache=1;
for(int i=0;i<4;i++){
int ny=y+dy[i];
int nx=x+dx[i];
if(isrange(ny,nx)&&matrix[y][x]<matrix[ny][nx]){
cache=max(cache,dfs(matrix,ny,nx)+1);
}
}
return cache;
}
int longestIncreasingPath(vector<vector<int>>& matrix) {
int res=0;
n=matrix.size();
m=matrix[0].size();
memset(dp,-1,sizeof(dp));
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(dp[i][j]==-1){
res=max(res,dfs(matrix,i,j));
}
}
}
return res;
}
};
궁금한전 혹은 모르는점 어떤질문이든 댓글은 언제나 환영입니다.
'LeetCode' 카테고리의 다른 글
[LeetCode] 315. Count of Smaller Numbers After Self (2) | 2023.10.15 |
---|---|
[LeetCode] 282. Expression Add Operators (0) | 2023.10.14 |
[LeetCode] 875. Koko Eating Bananas (0) | 2023.09.12 |
[LeetCode] 2834. Find the Minimum Possible Sum of a Beautiful Array (0) | 2023.09.12 |
[LeetCode] 300. Longest Increasing Subsequence (0) | 2023.09.12 |