【问题标题】:Can't spot the bug in my rotate matrix code在我的旋转矩阵代码中找不到错误
【发布时间】:2018-09-25 03:24:54
【问题描述】:

我知道有一种简单的方法可以使用转置将方阵旋转 90 度,但我正在编写一个解决方案,就好像我不知道那样(换句话说,我想做交换)。下面的一般想法是逐层交换。 offset 代表正在交换的层(从外到内)。

这是算法(注意它被包裹在 class 中,因为这是 Leetcode 的东西):

class Solution:
    def rotate(self, matrix):
        for start in range(len(matrix)//2):
            end = len(matrix) - start - 1

            # swap all 4 coordinates:
            for offset in range(start, end): 
                # swap top_left over top_right
                temp, matrix[start+offset][end] = matrix[start+offset][end], matrix[start][start+offset]

                # swap top_right -> bottom_right 
                temp, matrix[end][end-offset] = matrix[end][end-offset], temp

                # swap bottom_right -> bottom_left
                temp, matrix[end-offset][start] = matrix[end-offset][start], temp

                # swap bottom_left -> top_left 
                matrix[start][start+offset] = temp

这适用于一些小矩阵的手动测试,以及 Leetcode 提交中的较小输入测试用例。但是,它在以下输入时失败:

[[ 2,  29,  20,  26,  16,  28],
 [12,  27,   9,  25,  13,  21],
 [32,  33,  32,   2,  28,  14],
 [13,  14,  32,  27,  22,  26],
 [33,   1,  20,   7,  21,   7],
 [ 4,  24,   1,   6,  32,  34]]

预期输出:

[[ 4,  33,  13,  32,  12,   2],
 [24,   1,  14,  33,  27,  29],
 [ 1,  20,  32,  32,   9,  20],
 [ 6,   7,  27,   2,  25,  26],
 [32,  21,  22,  28,  13,  16],
 [34,   7,  26,  14,  21,  28]]

我的输出:

[[ 4,  33,  13,  32,  12,   2],
 [24,   1,   7,  33,  27,  29],
 [ 1,  20,  32,   2,  14,  20],
 [ 6,  28,  32,  27,  25,  26],
 [32,  21,  22,   9,  13,  16],
 [34,   7,  26,  14,  21,  28]]

这个矩阵足够大,以至于手动遍历算法变得乏味,就像我对较小的输入案例进行调试一样。我的实现中的错误在哪里?

【问题讨论】:

    标签: python algorithm matrix


    【解决方案1】:

    您的offset关闭,试试

    for offset in range(0, end-start):
    

    【讨论】:

      【解决方案2】:

      您的(随机)测试数据很难跟踪和调试。最好使用可读集。

      似乎实现也会产生过多的交换。

      记住单元格值,循环移动数据单元格,检索记住的值就足够了。

      这是一个简单的旋转实现,垫子上填充了序号:

      n = 5
      nm = n - 1
      mat = []
      for i in range(n):
          a = [x for x in range(n*i, n*i+n)]
          mat.append(a)
      
      for i in range(n):
         (print(mat[i]))
      
      for row in range((n + 1)//2):
          for col in range(n//2):
              t = mat[row] [col]
              mat[row][col] = mat[nm-col][row]
              mat[nm-col][row] = mat[nm-row][nm-col]
              mat[nm-row][nm - col] = mat[col][nm-row]
              mat[col][nm-row] = t    
      
      print("")
      for i in range(n):
         (print(mat[i]))
      
      [0, 1, 2, 3, 4]
      [5, 6, 7, 8, 9]
      [10, 11, 12, 13, 14]
      [15, 16, 17, 18, 19]
      [20, 21, 22, 23, 24]
      
      [20, 15, 10, 5, 0]
      [21, 16, 11, 6, 1]
      [22, 17, 12, 7, 2]
      [23, 18, 13, 8, 3]
      [24, 19, 14, 9, 4]
      

      【讨论】:

        【解决方案3】:

        为了进行旋转,输入矩阵的第 i 行和第 j 列的值应该等于输出矩阵的第 j 行第 i 列(转置)和(下一个步骤)列应颠倒。如果我是你,我会定义一个空矩阵并且(比如 TRANSPOSE,与输入矩阵具有相同的大小),将定义 2 个 for 循环(i 在范围 len(matrix) 中,j 在范围 len(matrix) 中)。里面第二个循环我会写

        TRANSPOSE[i][j] = matrix[j][i]
        

        现在我有了你想要的反列矩阵。现在我们需要反转列来得到你想要的,所以我会定义另一个具有相同变量和范围的 for 循环,并且需要一个相同大小的空矩阵或者我们可以再次使用输入矩阵,让我们使用输入矩阵在这种情况下。

        matrix[i][j] = TRANSPOSE[i][len(matrix) - j - 1]
        

        并返回matrix

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-01-17
          • 1970-01-01
          • 1970-01-01
          • 2016-12-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多