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];
}
}
}
返回对角线;
}

可能不是最优的,因为您实际上遍历的矩阵大小几乎是两倍,但它非常直观。

我认为您的输出与您的问题不匹配可能相关:我已更改输出以匹配问题,感谢链接。这与我要查找的类似,但它从左上角开始。我会玩弄这些代码,看看是否能让我工作,谢谢