【问题标题】:How to perform spiral order traversalin one dimensional array? [duplicate]如何在一维数组中执行螺旋顺序遍历? [复制]
【发布时间】:2012-12-26 10:37:45
【问题描述】:

可能的重复:
Looping in a spiral
Writing a string in a spiral
Print two-dimensional array in spiral order
2d Array in Spiral Order

我们有一个矩阵形式的数据

0 0 0 0 0
0 1 2 3 0
0 4 5 6 0
0 7 8 9 0
0 0 0 0 0

以这种方式存储在一维数组中

[0 0 0 0 0 0 1 2 3 0 0 4 5 6 0 0 7 8 9 0 0 0 0 0 0]

这是一个零填充的 3x3 数组转换为 5x5。我们知道开始索引和结束索引。

如我们所见,我们可以执行 25 次操作并打印所有值,但如果我们按照螺旋顺序进行,理想情况下应该只执行 9 次操作。

有人知道怎么做吗?

我们知道行数和列数。这里应该是 rows=5 cols=5。

因此起始索引为 rows+1,结束索引为 rows*cols-6

我将其可视化为螺旋顺序遍历。

【问题讨论】:

  • 你的意思是按螺旋顺序排列?你有一个一维数组,不是吗?
  • 什么是开始索引和结束索引?引导我们完成当前示例。
  • 它是一个一维数组,将解可视化为螺旋顺序,起始索引为 6,结束索引为 18。
  • 数组总是奇数吗?如果是这样,在特定情况下获得 1,4 和 7 的索引是非常简单的数学运算。
  • 不是奇数,是mXn

标签: algorithm data-structures


【解决方案1】:

我会这样做:

   POINT ul = (start_idx/width, start_idx%width);
   POINT br = (end_idx/width, end_idx%width);
   POINT p = ul
   dir = RIGHT;
   while (ul != br)
     visit(ARRAY[p.x+p.y*WIDTH])
     case dir
        when RIGHT:   
           p.x+=1
           if (p.x==br.x) 
             dir = DOWN
             ul.y++;
         when DOWN
           p.y+=1
           if (p.y==br.y) 
             dir = LEFT
             br.x--;
         when LEFT: 
            //like RIGHT but -1 and adjust br.y upwards when done
         when UP:
            //like DOWN but -1 and adjust ul.x rightward when done
    endwhile

这个想法是跟踪要访问的虚拟 x 和 y。沿着由起点和终点定义的框的侧面移动要访问的点。完成访问后,向内调整两侧。

【讨论】:

    【解决方案2】:

    假设您的 5x5 矩阵假设索引基数为零,您知道行索引是:
    0,1,2,3,4
    5,6,7,8,9
    10,11,12,13,14
    15,16,17,18,19
    @987654326 @

    您知道您的第一个索引是6,最后一个索引是18。因此,作为起点,您知道可以消除矩阵的以下部分:

    0,1,2,3,4

    19,20,21,22,23,24,25

    这算作2 操作。

    您还知道,由于您从索引6 开始,并且它是3x3,您只需要转到索引8,这是一个操作。

    然后您需要将5 添加到您之前的@​​987654336@ 索引中,这将产生11 并再次继续(总共2 操作)当前操作计数为5

    使用11 再次执行此操作,您将获得16 一次操作。再进行 2 次操作,最终得到 18。现在总共是 8 次操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多