【LeetCode】1260. 二维网格迁移

350 阅读3分钟

image.png

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第5天,点击查看活动详情

测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。

怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~

一、题目描述:

  • 题目内容

image.png

  • 题目示例

image.png

  • 题目解析

    • m == grid.length
    • n == grid[i].length
    • 1 <= m <= 50
    • 1 <= n <= 50
    • 1000 <= grid[i][j] <= 1000
    • 0 <= k <= 100

二、思路分析:

我们拿到本题,读取题意要求我们对二维的网络格按照一定规律进行移动,输出移动后的二维数组。二维网格中每一个元素都是怎么移动的呢?,我们继续对题目内容审题:

  • 每行网格grid[i][j]按照grid[i][j + 1]
  • 每行网格grid[i]最后一个元素移动到下一行的第一个grid[i+1][0]
  • 最后一行最后一列grid[n-1][m-1]的元素移动到第一行第一列第一个位置上grid[0][0]

看完规则,总结一下每一次二维网格的移动是按照倒Z形的形状移动的,例如示列1如图:

image.png

因此,解答本题我们直接使用模拟网格迁移规律来进行迁移,思路大致如下:

  • 每一次迁移的次数是有K参数决定的,当K=0时,则直接返回原网格grid
  • 使用for循环取出grid中每一层的内容g
  • 再使用一个for循环从n-1开始从右到左往前替换,g[j],g[j-1]=g[j-1],g[j]
  • 然后再使用一个for循环对每一行grid[i][0]从下m-1到上进行替换g[i][0],g[i-1][0]= g[i-1][0] = g[i-1][0],g[i][0]

我们再使用示列1进行替换演示,如图所示:

image.png

根据以上思路,我们使用Python代码进行实现如下:

class Solution(object):
    def shiftGrid(self, grid, k):
        """
        :type grid: List[List[int]]
        :type k: int
        :rtype: List[List[int]]
        """
        m = len(grid)
        n = len(grid[0])

        if  k == 0: return grid

        def change(grid):

            for i,g in enumerate(grid): 
                for j in range(n-1,0,-1):
                    g[j],g[j-1] = g[j-1],g[j]            
            for i in range(m-1,-0,-1):
                grid[i][0],grid[i-1][0] = grid[i-1][0],grid[i][0]
            return grid
            
        for i in range(k):  
            ans = change(grid)

        return ans

其实,我们可以观察二维网格元素移动,可以推出一定规律:

  • 我们可以对二维网格元素转换成一维网格,它们坐标下标:index = i*n+j
  • 当迁移K次后,元素坐标移动是index1 = (index+k)mod(m*n)
class Solution(object):
    def shiftGrid(self, grid, k):
        """
        :type grid: List[List[int]]
        :type k: int
        :rtype: List[List[int]]
        """

        m = len(grid)
        n = len(grid[0])

        ans = [[0]*n for _ in range(m)]
        for i, row in enumerate(grid):
            for j ,r in enumerate(row):
                index1 = (i * n + j + k) % (m * n)
                ans[index1 // n][ index1 % n] = r
        
        return ans

三、总结:

本题考察二维数组元素移动,解答本题的技巧可以将其元素转换成一维数组,AC提交记录如下:

image.png

  • 时间复杂度:O(mn),mn个元素遍历
  • 空间复杂度:O(1)

以上是本期内容,欢迎大佬们点赞评论,下期见~~