題目連結:
題目意譯:
在 MATLAB 中有一個相當有用的函式叫做「reshape」,其可以將一個矩陣重新塑形(Reshape)變成另一個不同大小的矩陣,同時保有著原有的資料。
給定你一個以二維陣列代表的矩陣,以及兩個正整數 r 、 c ,依序代表重新塑形後預計的目標列數以及目標行數。
重新塑形後的矩陣應將所有元素按照原矩陣的列探訪(Row-Traversing)之順序依序填入其中。
如果重新塑形這個操作以及給定的參數可行且合法,則輸出重新塑形後的矩陣;反之,輸出原本的矩陣。
注:
給定的矩陣之高度以及寬度坐落於 [1, 100] 的範圍中。
給定的 r 和 c 之值皆為正數。
範例測資:
範例 1:
輸入:
nums =
[[1,2],
[3,4]]
r = 1, c = 4
輸出:
[[1,2,3,4]]
解釋:
nums 陣列的列探訪為 [1,2,3,4]。重新塑形的矩陣為一個 1 × 4 的矩陣,一列一列將前面的列表之元素填入其中。
範例 2:
輸入:
nums =
[[1,2],
[3,4]]
r = 2, c = 4
輸出:
[[1,2],
[3,4]]
解釋:
沒有任何方法可以將一個 2 × 2 矩陣重新塑形成為一個 2 × 4 的矩陣。所以輸出原本的矩陣。
解題思維:
先判斷 r 、 c 之乘積是否等於 nums 陣列的大小。如果不等於則不可能重新塑形成目標列數以及行數,所以直接回傳原陣列。
利用雙層迴圈將 nums 陣列一列一列地掃過(列探訪),然後利用兩個計數器 nowRow 以及 nowColumn (假設陣列的索引值從 0 開始,則兩數初始化為 0)代表著現在要將數字填入新矩陣的第 nowRow 列第 nowColumn 列。
每填入一個數字就將 nowColumn 加 1 ,然後判斷 nowColumn 是否等於 c。如果等於 c 則代表新矩陣的一列已經放完了,要換下一列,因此將 nowColumn 歸零並將 nowRow 加 1 。由此,我們便可求出所求的新矩陣。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。