zoukankan      html  css  js  c++  java
  • [LeetCode] 1260. Shift 2D Grid

    Given a 2D grid of size m x n and an integer k. You need to shift the grid k times.

    In one shift operation:

    • Element at grid[i][j] moves to grid[i][j + 1].
    • Element at grid[i][n - 1] moves to grid[i + 1][0].
    • Element at grid[m - 1][n - 1] moves to grid[0][0].

    Return the 2D grid after applying shift operation k times.

    Example 1:

    Input: grid = [[1,2,3],[4,5,6],[7,8,9]], k = 1
    Output: [[9,1,2],[3,4,5],[6,7,8]]
    

    Example 2:

    Input: grid = [[3,8,1,9],[19,7,2,5],[4,6,11,10],[12,0,21,13]], k = 4
    Output: [[12,0,21,13],[3,8,1,9],[19,7,2,5],[4,6,11,10]]
    

    Example 3:

    Input: grid = [[1,2,3],[4,5,6],[7,8,9]], k = 9
    Output: [[1,2,3],[4,5,6],[7,8,9]]

    Constraints:

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

    二维网格迁移。

    一开始审题的时候,直观感觉这个题很像54题那一类matrix的题型,一直在想有没有不用额外空间或者原地修改matrix的做法。首先我给一个朴素的解法。思路是先遍历matrix,把每个元素按顺序放入一个双端队列deque中。将K % mn之后,把元素再按序放到list。最后输出的是list of list。

    时间O(mn)

    空间O(n) - queue

    Java实现

     1 class Solution {
     2     public List<List<Integer>> shiftGrid(int[][] grid, int k) {
     3         int m = grid.length;
     4         int n = grid[0].length;
     5         List<List<Integer>> res = new ArrayList<>();
     6         Deque<Integer> queue = new ArrayDeque<>();
     7         for (int i = 0; i < m; i++) {
     8             for (int j = 0; j < n; j++) {
     9                 queue.add(grid[i][j]);
    10             }
    11         }
    12         for (int i = 0; i < k; i++) {
    13             queue.addFirst(queue.pollLast());
    14         }
    15         for (int i = 0; i < m; i++) {
    16             List<Integer> temp = new ArrayList<>();
    17             for (int j = 0; j < n; j++) {
    18                 temp.add(queue.poll());
    19             }
    20             res.add(new ArrayList<Integer>(temp));
    21         }
    22         return res;
    23     }
    24 }

    不使用deque的方法如下。因为结果集是list of list,所以并不涉及到对原input matrix中元素的移动,你只需要确定结果集的每个list放的元素是来自matrix的哪些坐标即可。首先K还是要去 % 一下matrix的总长度m * n,这样就知道K到底在matrix的什么位置。同时需要把这个二维坐标转换成一维的,这样便于计算。16行的减K相当于是去找原matrix中前K个位置上的那个元素。

    时间O(mn)

    空间O(1)

    Java实现

     1 class Solution {
     2     public List<List<Integer>> shiftGrid(int[][] grid, int k) {
     3         List<List<Integer>> res = new ArrayList<>();
     4         int m = grid.length;
     5         int n = grid[0].length;
     6         // total length of the matrix
     7         int total = m * n;
     8         k = k % total;
     9         // create all the sub lists
    10         for (int i = 0; i < m; i++) {
    11             res.add(new ArrayList<>());
    12         }
    13         // start to put elements into lists
    14         // 2d to 1d
    15         for (int l = 0; l < total; l++) {
    16             int index = (l - k + total) % total;
    17             res.get(l / n).add(grid[index / n][index % n]);
    18         }
    19         return res;
    20     }
    21 }

    LeetCode 题目总结

  • 相关阅读:
    把A库aa表结构复制到B库中生成bb表
    C #登录代码
    C# 跟查询有关的代码
    C# 输出用“*”组成的菱形
    POJ 3696 The Luckiest number 数论,GCD
    用一句SQL取出第 m 条到第 n 条记录的方法
    Web Services的基本原理
    常用SQL语句
    什么应用适合Web Services
    应该了解的垃圾收集机制(一)
  • 原文地址:https://www.cnblogs.com/cnoodle/p/13512054.html
Copyright © 2011-2022 走看看