代码之家  ›  专栏  ›  技术社区  ›  Lore

矩阵特殊遍历的智能方法

  •  0
  • Lore  · 技术社区  · 6 年前

    我必须穿过 n x n Java中的矩阵(所以索引是0,…,n-1),将值分配给单个元素。我必须从右下角开始到左上角。特别是我不必考虑 matrix[n-1][n-1] 元素,之前已初始化。相邻的值相互依赖,必须先初始化。

    一种方法是插入 if for 周期

    for (i = n-1; i >= 0; i--)
      for (j = n-1; j >= 0; j--)
        if (i == n - 1 && j == n - 1)
          //initialize particular value
        else
          //initialize others
    

    但在我看来效率有点低。

    另一种方法是初始化该值 矩阵[N-1][N-1] 在循环之外,然后执行3 对于 循环(一个用于底线,一个用于最右边的列,一个用于其他元素)。但看起来有点不雅。

    所以我正在寻找一个只有两个周年纪念的解决方案 对于 在每个循环中都没有控件(如第一个示例)。

    2 回复  |  直到 6 年前
        1
  •  2
  •   Joakim Danielson    6 年前

    这里有一种方法,通过矩阵使用一个循环,这使得避免矩阵[N-1][N-1]变得容易。不知道从性能角度看,计算如何与if-though进行比较

    int[][] matrix = new int[n][n];
    
    int current = n * n - 2;
    int row = 0;
    int col = 0;
    while (current >= 0) {
        col = current % n;
        row = current / n;
    
        matrix[row][col] = //init stuff
        current--;
    }
    
        2
  •  1
  •   Lore    6 年前

    我认为Joakim的解决方案是好的,除了百分比和/操作…受此启发,我发现了一个有趣的变体,可以避开它们。我已经调用了列索引 j1 以避免其他“正常”循环出现问题。

    matrix[n-1][n-1] = //init code;
    int j1 = n-2;
    
        for (int i = n-1; i >= 0; i--) {
            for (; j1 >= 0; j1--) {
                matrix[i][j1] = //init code;
            }
            j1 = n-1;
        }