Java 在数组中存储从右上到左下的所有对角线
我试图将所有值从右上到左下存储在矩阵中,并将它们存储在Java 在数组中存储从右上到左下的所有对角线,java,Java,我试图将所有值从右上到左下存储在矩阵中,并将它们存储在数组中 int matrixSample [][] = { {6,4,1,4}, {7,5,4,4}, {4,4,8,3}, {4,4,8,3} }; 输出应该是 [4,1,4,4,4,3,6,5,8,3,7,4,8,4,4,4] 我可以得到右下角的对角线 static int[] getAllDiagonal
数组中
int matrixSample [][] = {
{6,4,1,4},
{7,5,4,4},
{4,4,8,3},
{4,4,8,3}
};
输出应该是
[4,1,4,4,4,3,6,5,8,3,7,4,8,4,4,4]
我可以得到右下角的对角线
static int[] getAllDiagonalsInMatrix(int matrix[][]){
// Sum of arithmetic progression
int diagonal[] = new int[matrix.length * (matrix.length + 1)*2];
int index = 0;
for(int row = 0; row < matrix.length; row++) {
for(int col = 0; col < matrix[row].length - row; col++) {
diagonal[index++] = matrix[row + col][col];
}
}
return diagonal;
}
static int[]getAllDiagonalsInMatrix(int-matrix[]{
//算术级数和
int对角线[]=新int[matrix.length*(matrix.length+1)*2];
int指数=0;
对于(int row=0;row
通过在上面的循环中进行调整,使用相同的两个循环是否可以做到这一点?好的,下面是我对您的问题的思考过程。但是,我将打印值,而不是收集值,这样对我来说会更容易一些,并使解决方案易于阅读
首先,如何得到对角线?我们需要经常这样做,所以让我们先为它创建一个函数。也许我们可以从对角线的左上角通过,然后从那里出发
public void getDiagonal(int[][]数组、int行、int列){
//而行和列在数组的边界内
while(行
现在我们有了一个得到对角线的函数,我们只需要一种方法来调用它。基本上,我们只需要遵循一个L形,从右上角到左上角再到左下角
//获取从第一行开始且列>0的对角线
对于(int col=array.length-1;col>0;col--){
getDiagonal(数组,0,列);
}
//获取从最左边的列开始的所有对角线
for(int row=0;row
现在我们有了一种迭代值的有效方法,我们可以重写它以将值保存到数组中。您也可以选择现在有了一个进程就完全删除该函数
编辑:我差点忘了,但你要找的数学解如下
for(int row=0;row=行){
int start=array.length-1-(列-行);
int passed=start*(start+1)/2;
解决方案[通过+对角]=数组[行][列];
}否则{
int start=array.length-1-(行-列);
int passed=array.length*array.length-1-start*(start+1)/2;解决方案[passed-array.length+1+row]=array[row][col];
}
}
}
一个解决方案是迭代一个矩阵,考虑矩阵之外的位置,但排除每个索引超出界限。
static int[] getDiagonals(int[][] mat) {
int diagonal[] = new int[mat.length * (mat[0].length)];
int index = 0;
int yStart = -mat[0].length;
for (int y = yStart; y < mat.length; y++) {
for (int x = 0; x < mat[0].length; x++) {
if (y + x >= 0 && y + x < mat.length) {
diagonal[index++] = mat[y+x][x];
}
}
}
return diagonal;
}
static int[]getDiagonals(int[]mat){
int对角线[]=新int[mat.length*(mat[0].length)];
int指数=0;
int yStart=-mat[0]。长度;
对于(int y=yStart;y=0&&y+x<材料长度){
对角线[index++]=mat[y+x][x];
}
}
}
返回对角线;
}
可能不是最优的,因为您实际上遍历的矩阵大小几乎是两倍,但它非常直观。我认为您的输出与您的问题不匹配可能相关:我已更改输出以匹配问题,感谢链接。这与我要查找的类似,但它从左上角开始。我会玩弄这些代码,看看是否能让我工作,谢谢