在MATLAB中,有一个非常有用的函数 reshape,它可以将一个矩阵重塑为另一个大小不同的新矩阵,但保留其原始数据。给出一个由二维数组表示的矩阵,以及两个正整数r和c,分别表示想要的重构的矩阵的行数和列数。重构后的矩阵需要将原始矩阵的所有元素以相同的行遍历顺序填充。如果具有给定参数的reshape操作是可行且合理的,则输出新的重塑矩阵;否则,输出原始矩阵。 具体题目链接
class Solution:
def matrixReshape(self, mat: List[List[int]], r: int, c: int) -> List[List[int]]:
if r*c!=len(mat)*len(mat[0]):
return mat
ans,ans_r,t=[],[],0
for i in mat:
for j in i:
ans_r.append(j)
t+=1
if t==c:
t=0
ans.append(ans_r)
ans_r=[]
return ans
思路:简单题。每循环c个则创建一个ans_r,并将列表添加到ans中。
func matrixReshape(nums [][]int, r int, c int) [][]int {
n, m := len(nums), len(nums[0])
if n*m != r*c {
return nums
}
ans := make([][]int, r)
for i := range ans {
ans[i] = make([]int, c)
}
for i := 0; i < n*m; i++ {
ans[i/c][i%c] = nums[i/m][i%m]
}
return ans
}
思路:这个思路很厉害,通过一次m*n的遍历,通过除数和商形式实现换行形式。
给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。在「杨辉三角」中,每个数是它左上方和右上方的数的和。 具体题目链接
class Solution:
def generate(self, numRows: int) -> List[List[int]]:
ret = []
for i in range(numRows):
row = []
for j in range(0, i + 1):
if j == 0 or j == i:
row.append(1)
else:
row.append(ret[i - 1][j] + ret[i - 1][j - 1])
ret.append(row)
return ret
思路:每一行的第一个和最后一个都是1,其余等于上方两个之和,采用列表形式来储存杨辉三角。
func generate(numRows int) [][]int {
ans := make([][]int, numRows)
for i := range ans {
ans[i] = make([]int, i+1)
for j := 0; j <=i; j++ {
if j==0 || j==i{
ans[i][j] = 1
}else{
ans[i][j] = ans[i-1][j] + ans[i-1][j-1]
}
}
}
return ans
}
思路:参考python