題目概述
給出一個由二維陣串列示的矩陣,以及兩個正整數 r 和 c,分別表示想要的重構的矩陣的行數和列數
重構后的矩陣需要將原始矩陣的所有元素以相同的行遍歷順序填充
如果具有給定引數的 reshape 操作是可行且合理的,則輸出新的重塑矩陣;否則,輸出原始矩陣
示例一如下:
輸入:
nums = [[1,2],[3,4]]
r = 1, c = 4
輸出:
[[1,2,3,4]]
解釋:
行遍歷 nums 的結果是 [1,2,3,4],新的矩陣是 1 * 4 矩陣,用之前的元素值一行一行填充新矩陣
示例二如下:
輸入:
nums = [[1,2],[3,4]]
r = 2, c = 4
輸出:
[[1,2],[3,4]]
解釋:
沒有辦法將 2 * 2 矩陣轉化為 2 * 4 矩陣, 所以輸出原矩陣
解題思路
最簡單的思路,遍歷原陣列,將元素放進新陣列里邊,設定兩個標志位防止下標越界
class Solution {
public int[][] matrixReshape(int[][] nums, int r, int c) {
int row = nums.length;
int col = nums[0].length;
int eleCount = row * col;
if(eleCount != r * c) {
return nums;
}
int colFlag = 0;
int rowFlag = 0;
int[][] newNums = new int[r][c];
for(int i = 0; i < row; i++) {
for(int j = 0; j < col; j++) {
if(colFlag == c) {
rowFlag++;
colFlag = 0;
}
newNums[rowFlag][colFlag] = nums[i][j];
colFlag++;
}
}
return newNums;
}
}
另一種思路是按照下面的規則直接將元素映射到新陣列中
- 設 nums 為 m 行 n 列,x = m * n,我們可以將整數 x 映射回其在矩陣中的下標,即
- i = x / n
- j = x % n
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;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/260496.html
標籤:其他
上一篇:春節假期的復盤
下一篇:旋轉陣列的最小數字
