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 题目总结

  • 相关阅读:
    HDU 1261 字串数(排列组合)
    Codeforces 488C Fight the Monster
    HDU 1237 简单计算器
    POJ 2240 Arbitrage
    POJ 3660 Cow Contest
    POJ 1052 MPI Maelstrom
    POJ 3259 Wormholes
    POJ 3268 Silver Cow Party
    Codesforces 485D Maximum Value
    POJ 2253 Frogger(最短路)
  • 原文地址:https://www.cnblogs.com/cnoodle/p/13512054.html
Copyright © 2011-2022 走看看