从数组右上到左下存储所有对角线

戴夫

我试图将所有值存储在矩阵中,从右上到左下,并将它们存储在中array

    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;
}

通过在上面的循环中进行调整,是否可以使用相同的两个循环?

洛克

好的,这是我对您的问题的思考过程。但是,我将打印值而不是收集值,以使它对我来说更容易一点,并使解决方案易于阅读。

首先,如何得到对角线?我们需要经常执行此操作,因此让我们开始为此创建一个函数。也许我们可以通过对角线的左上角并从那里去。

public void getDiagonal(int[][] array, int row, int col) {
    // While row and col are within the bounds of the array
    while (row < array.length && col < array[row].length) {
        // Print element in diagonal
        System.out.println(array[row][col]);

        // Diagonal moves from top-left to bottom-right
        row++;
        col++;
    }
}

现在我们有了一个获取对角线的函数,我们只需要一种调用它的方法。本质上,我们只需要遵循从右上角到左上角再到左下角的L形。

// Get diagonals starting in the first row with a column > 0 
for (int col = array.length - 1; col > 0; col--) {
    getDiagonal(array, 0, col);
}

// Get all diagonals starting from the left most column
for (int row = 0; row < array.length; row++) {
    getDiagonal(array, row, 0);
}

现在,我们有了一种遍历值的可行方法,我们可以重写它以将值保存到数组中。您现在也可以选择完全删除该功能,因为您已经有了一个过程。

编辑:我几乎忘记了,但是您正在寻找的数学解决方案如下。

for (int row = 0; row < array.length; row++) {
    for (int col = 0; col < array.length; col++) {
        // Index along diagonal
        int diagonal = Math.min(row, col);

        // Which part of L contains value
        if (col >= row) {
            int start = array.length - 1 - (col - row);
            int passed = start * (start + 1) / 2;
            solution[passed + diagonal] = array[row][col];
        } else {
            int start = array.length - 1 - (row - col);
            int passed = array.length * array.length - 1 - start * (start + 1) / 2;          solution[passed - array.length + 1 + row] = array[row][col];
        }
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从矩阵python 2的右上到左下打印对角线

来自分类Dev

从左下到右上对角线遍历2D数组矩阵

来自分类Dev

为所有对角线创建一个NxN数组

来自分类Dev

查找矩阵大对角线以下的所有元素

来自分类Dev

JS + CSS如何从右上到左下显示数组中的图像

来自分类Dev

创建矩阵,其中所有对角线在反对角线方向上均具有相同的值

来自分类Dev

填写numpy数组的对角线失败

来自分类Dev

数组的numpy和反对角线

来自分类Dev

Javascript:获取对角线数组

来自分类Dev

多维numpy数组的对角线

来自分类Dev

求数组对角线和的错误

来自分类Dev

使用NumPy查找所有n维线和对角线

来自分类Dev

带有图像的对角线部分

来自分类Dev

给定矩阵x,将主对角线以下的所有元素设置为0

来自分类Dev

对布尔numpy矩阵的所有对角线元素进行求和

来自分类Dev

粘贴n * n矩阵或数据帧的所有可能对角线

来自分类Dev

如何从Ruby中的一组单词中获取所有对角线?

来自分类Dev

如何在矩阵中生成所有可能的 k 大小向量(包括对角线)?

来自分类Dev

使用xml从右上到左下的Android动画

来自分类Dev

视线对角线

来自分类Dev

映射对角线

来自分类Dev

从给定的numpy数组创建块对角线numpy数组

来自分类Dev

修改多维numpy数组中的对角线

来自分类Dev

数组随机洗牌,但对角线固定

来自分类Dev

使用循环修改np.diag的对角线数组

来自分类Dev

在二维数组中搜索对角线

来自分类Dev

修改多维numpy数组中的对角线

来自分类Dev

在2D数组上添加对角线

来自分类Dev

使用数组创建对象的对角线使用 for in 循环