【学習レポート】「LeetCode9日間トレーニング」Day8レベル2ポインタ

質問1:画像を反転する

nxnバイナリマトリックス画像が与えられた場合、画像を水平方向に反転し、画像を反転して結果を返します。

画像を水平方向に反転すると、画像の各行が反転します。つまり、順序が逆になります。

例如,水平翻转 [1,1,0] 的结果是 [0,1,1]。

画像を反転すると、画像内のすべての0が1に置き換えられ、すべての1が0に置き換えられます。

例如,反转 [0,1,1] 的结果是 [1,0,0]。
class Solution {
    
    
    public int[][] flipAndInvertImage(int[][] A) {
    
    
        int x=A.length,y=A[0].length;
        int[][] B = new int[x][y];
        for (int i=0;i<x;i++){
    
    
            for (int j=0;j<y;j++){
    
    
                B[i][y-j-1]=1-A[i][j];   //从后往前赋值,同时取反
            }
        }
        return B;
    }
}

ここに画像の説明を挿入

質問2:行列を転置する

2D整数配列が与えられた場合、のmatrix転置行列を返します。matrix

行列の転置とは、行列の主対角線を反転し、行列の行と列のインデックスを入れ替えることを指します。

class Solution {
    
    
    public int[][] transpose(int[][] matrix) {
    
    
    int m = matrix.length;
    int n = matrix[0].length;
    int[][] res = new int[n][m];
    for (int i = 0; i < m; i++) {
    
    
        for (int j = 0; j < n; j++) {
    
    
            res[j][i] = matrix[i][j];
        }
    }
    return res;
}
}

ここに画像の説明を挿入

質問3:マトリックスの形を変える

MATLABには、非常に便利な関数reshapeがあります。これは、mxn行列を異なるサイズ(rxc)の別の新しい行列に再形成できますが、元のデータは保持します。

2次元配列マットで表されるmxn行列と、目的の再構成された行列の行数と列数をそれぞれ表す2つの正の整数rとcが与えられます。

再構築された行列は、同じ行トラバーサル順序で元の行列のすべての要素で満たされる必要があります。

指定された引数を使用した形状変更操作が実行可能で合理的である場合は、新しい形状変更行列を出力します。それ以外の場合は、元の行列を出力します。

class Solution {
    
    
    public int[][] matrixReshape(int[][] nums, int r, int c) {
    
    
        int m = nums.length;
        int n = nums[0].length;
        if (m * n != r * c) {
    
    
            return nums;
        }

        int[][] ans = new int[r][c];
        for (int x = 0; x < m * n; ++x) {
    
    
            ans[x / c][x % c] = nums[x / n][x % n];
        }
        return ans;
    }
}

ここに画像の説明を挿入

質問4:1D配列を2D配列に変換する

0から始まる添え字と2つの整数mおよびnを持つ元の1次元整数配列が与えられます。オリジナルのすべての要素を使用して、m行n列の2D配列を作成する必要があります。

元の形式で下付き文字が0からn-1(両方を含む)の要素は2次元配列の最初の行を形成し、下付き文字がnから2 * n-1(すべてを含む)の要素は2番目の行を形成します。 2次元配列など。

上記のプロセスに従って、mxn2次元配列を返してください。このような2次元配列を作成できない場合は、空の2次元配列を返送してください。

class Solution {
    
    
    public int[][] construct2DArray(int[] original, int m, int n) {
    
    
        if(original.length != m * n) return new int[][]{
    
    };
        int[][] ans = new int[m][n];
        int idx = 0;
        for(int i = 0 ; i < m ; i++){
    
    
            for(int j = 0 ; j < n ; j++){
    
    
                ans[i][j] = original[idx++];
            }
        }
        return ans;
    }
}

ここに画像の説明を挿入

質問5、1260。2次元グリッド移行

難易度イージー52

m行n列と整数kの2次元グリッドが与えられます。グリッドを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回の転送操作後に最終的な2Dグリッドを返送してください。

class Solution {
    
    
    public List<List<Integer>> shiftGrid(int[][] grid, int k) {
    
    
        List<List<Integer>> result = new ArrayList<List<Integer>>();
        int len =grid.length , len2 = grid[0].length;
        for(int i=0;i<k;i++){
    
    
           grid = shitftSignlGrid(grid);
        }
        for(int i=0;i<len;i++){
    
    
             List<Integer>  list = new ArrayList<>();
            for(int j=0;j<len2;j++){
    
    
                list.add(grid[i][j]);
            }
            result.add(list);
        }
        return result;
    }
    public int[][] shitftSignlGrid(int[][] grid){
    
    
        int len =grid.length , len2 = grid[0].length;
        int[][] newgrid = new int[len][len2];
        for(int i=0;i<len2;i++){
    
    
            for(int j=0;j<len;j++){
    
    
                if(i!=len2-1){
    
    
                     newgrid[j][i+1] = grid[j][i];
                }else if(i==len2-1 && j!=len-1){
    
    
                    newgrid[j+1][0] = grid[j][i];
                }else {
    
    
                    newgrid[0][0] = grid[j][i];
                }
              
            }
        }
        return newgrid;
    }
}

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/weixin_56321113/article/details/123388334