carloscn / structstudy

Leetcode daily trainning by using C/C++/RUST programming.
4 stars 1 forks source link

leetcode1260:二维网格迁移(shift-2d-grid) #199

Open carloscn opened 1 year ago

carloscn commented 1 year ago

问题描述

给你一个 m 行 n 列的二维网格 grid 和一个整数 k。你需要将 grid 迁移 k 次。

每次「迁移」操作将会引发下述活动:

位于 grid[i][j] 的元素将会移动到 grid[i][j + 1]。 位于 grid[i][n - 1] 的元素将会移动到 grid[i + 1][0]。 位于 grid[m - 1][n - 1] 的元素将会移动到 grid[0][0]。 请你返回 k 次迁移操作后最终得到的 二维网格。

示例 1:

输入:grid = [[1,2,3],[4,5,6],[7,8,9]], k = 1 输出:[[9,1,2],[3,4,5],[6,7,8]]

image

示例 2:

image

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

示例 3:

输入:grid = [[1,2,3],[4,5,6],[7,8,9]], k = 9 输出:[[1,2,3],[4,5,6],[7,8,9]]  

提示:

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

来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/shift-2d-grid

carloscn commented 1 year ago

问题分析

直接按照规则编程即可,题目中已经给了详细的步骤了。简化规则就是,所有元素向右蛇形环状移动一个index。把二维数组一维化,然后移动k个就好了。

pub fn shift_grid(grid: Vec<Vec<i32>>, k: i32) -> Vec<Vec<i32>>
{
    if k == 0 {
        return grid;
    }

    let len:usize = grid.len();
    let r_len:usize = grid[0].len();
    if len < 1 || r_len < 1 {
        return vec![];
    }

    let mut row:Vec<i32> = vec![];
    let mut ret_vec:Vec<Vec<i32>> = vec![];

    // 2D VEC conversion to one-dimensional
    for e in grid {
        row.append(&mut e.clone());
    }

    // shift K len element
    let mut k_shifted_vec:Vec<i32> = row.drain(row.len() - (k as usize)..row.len()).collect();
    k_shifted_vec.append(&mut row);

    // convert to rows
    for i in 0..len {
        ret_vec.push(k_shifted_vec.drain(0..r_len).collect());
    }

    return ret_vec;
}
carloscn commented 1 year ago

code

https://review.gerrithub.io/c/carloscn/structstudy/+/553103 https://github.com/carloscn/structstudy/commit/00e1771fb8689111614db169a0e0ca7b8cfe3d25