Java 在二维数组中查找最长的递增序列
我已经研究这个问题有一段时间了,没能想出解决办法;我希望你能帮忙 我想找出最长的递增数列。例如,如果我有以下4X4阵列:Java 在二维数组中查找最长的递增序列,java,matrix,Java,Matrix,我已经研究这个问题有一段时间了,没能想出解决办法;我希望你能帮忙 我想找出最长的递增数列。例如,如果我有以下4X4阵列: [![enter image description here][1]][1] int [] nums = { {97 , 47 , 56 , 36}, {35 , 57 , 41 , 13}, {89 , 36 , 98 , 75}, {25 , 45 , 26 , 17} }; 预期结果:
[![enter image description here][1]][1]
int [] nums = {
{97 , 47 , 56 , 36},
{35 , 57 , 41 , 13},
{89 , 36 , 98 , 75},
{25 , 45 , 26 , 17}
};
预期结果:返回8和LIS 17、26、36、41、47、56、57、97
我还没有答案,我正在努力找到它
17 (3,3)
26 (3,2)
36 (2,1)
41 (1,2)
47 (0,1)
56 (0,2)
57 (1,1)
97 (0,0)
我希望我的例子足够清楚
这是我的密码;当我试图找到最长的增长路径时,它不会向后,也不会对角。有人能帮我吗
public class Solution2 {
static int[] dx = { 1, -1, 0, 0 };
static int[] dy = { 0, 0, 1, -1 };
public static int longestIncreasingPath(int[][] matrix) {
if (matrix.length == 0)
return 0;
int m = matrix.length, n = matrix[0].length;
int[][] dis = new int[m][n];
int ans = 0;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
ans = Math.max(ans, dfs(i, j, m, n, matrix, dis));
}
}
return ans;
}
static int dfs(int x, int y, int m, int n, int[][] matrix, int[][] dis) {
if (dis[x][y] != 0)
return dis[x][y];
for (int i = 0; i < 4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if (nx >= 0 && ny >= 0 && nx < m && ny < n && matrix[nx][ny] > matrix[x][y]) {
dis[x][y] = Math.max(dis[x][y], dfs(nx, ny, m, n, matrix, dis));
}
}
return ++dis[x][y];
}
public static void main(String[] args) {
int arr[][] = {
{ 97, 47, 56, 36 },
{ 35, 57, 41, 13 },
{ 89, 36, 98, 75 },
{ 25, 45, 26, 17 }
};
System.out.println(longestIncreasingPath(arr));
}
}
公共类解决方案2{
静态int[]dx={1,-1,0,0};
静态int[]dy={0,0,1,-1};
公共静态int longestIncreasingPath(int[][]矩阵){
如果(矩阵长度==0)
返回0;
int m=矩阵.length,n=矩阵[0]。长度;
int[]dis=新的int[m][n];
int ans=0;
for(int i=0;i=0&&ny>=0&&nxmatrix[x][y]){
dis[x][y]=Math.max(dis[x][y],dfs(nx,ny,m,n,matrix,dis));
}
}
return++dis[x][y];
}
公共静态void main(字符串[]args){
int arr[][]={
{ 97, 47, 56, 36 },
{ 35, 57, 41, 13 },
{ 89, 36, 98, 75 },
{ 25, 45, 26, 17 }
};
System.out.println(longestIncreasingPath(arr));
}
}
据我所知,您尝试实施深度优先搜索,以查找递增顺序的最长路径。如果是这样的话,首先最好标记你访问过的数字。一个方便的解决方案是一个简单的解决方案。对于标记的数字,您可以使用它来检查特定数字是否已按递增顺序计数。这是给你的一个小提示
如果您仍然对深度优先搜索感到困惑,我建议您阅读,以便更好地理解该算法的全部内容
嗯,依我所知,您尝试实施深度优先搜索,以找到递增顺序的最长路径。如果是这样的话,首先最好标记你访问过的数字。一个方便的解决方案是一个简单的解决方案。对于标记的数字,您可以使用它来检查特定数字是否已按递增顺序计数。这是给你的一个小提示 如果您仍然对深度优先搜索感到困惑,我建议您阅读,以便更好地理解该算法的全部内容
HTH,evgeny我假设我们正在寻找一个严格的递增序列(这在最初的问题描述中并不清楚)。 然后,可以通过动态规划方法解决此问题: 1) 将单元格按其值按降序排序 2) 按降序指定从该单元格开始的最长路径的长度: 2a)如果您无法到达之前访问过的任何单元格,请分配1 2b)否则指定1+max(可到达的前一个单元格) 完成此操作后,总最大值为最长路径的长度。还可以通过在步骤2b)中记住max单元来找到路径本身 在示例中,这给出了:
0,3 2,1
cell 98 97 89 75 57 56 47 45 41 36 36 35 26 25 17 13
length 1 1 1 2 2 3 4 2 5 6 6 7 7 7 8 7
我假设我们正在寻找一个严格的递增序列(这在最初的问题描述中并不清楚)。 然后,可以通过动态规划方法解决此问题: 1) 将单元格按其值按降序排序 2) 按降序指定从该单元格开始的最长路径的长度: 2a)如果您无法到达之前访问过的任何单元格,请分配1 2b)否则指定1+max(可到达的前一个单元格) 完成此操作后,总最大值为最长路径的长度。还可以通过在步骤2b)中记住max单元来找到路径本身 在示例中,这给出了:
0,3 2,1
cell 98 97 89 75 57 56 47 45 41 36 36 35 26 25 17 13
length 1 1 1 2 2 3 4 2 5 6 6 7 7 7 8 7
我不明白你想做什么。您列出了不在您提供的数组中的最长序列;我甚至看不出你的答案和你的数据之间有什么关系。这个最长的序列是从哪里来的?我不清楚你的示例如何返回8?17->26->36->41->47->56->57->97它从数组的右下角开始,然后向上。。我在示例中添加了坐标。让我用我的话试试:你在矩阵中寻找一条路径,从一个单元格到相邻单元格。这不是一个NP难问题吗?这基本上是在图中寻找一条哈密顿路径,如果你可以从x移动到y(因此它们在矩阵中是相邻的)并且x