分类:数组-二维数组及滚动数组
题目描述:
给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。
在杨辉三角中,每个数是它左上方和右上方的数的和。
解题思路:
1.先生成k行的杨辉三角,再返回最后一行即第k行。
class Solution: def getRow(self, rowIndex: int) -> List[int]: ret = [] for i in range(1,rowIndex+2): temp = [1 for i in range(i)] for j in range (1,len(temp)-1): temp[j] = ret[i-2][j-1]+ret[i-2][j] ret.append(temp) return ret[-1]
class Solution: def getRow(self, rowIndex: int) -> List[int]: ret = list() for i in range(rowIndex+1): row = list() 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]
2.用一维数组,类似于动态规划中的滚动数组思想。
使用一维数组,然后从右向左遍历每个位置,每个位置的元素res[j]+= 其左边的元素 res[j - 1]。
为啥不从左向右遍历呢?因为如果从左向右遍历,那么左边的元素已经更新为第 i 行的元素了,而右边的元素需要的是第 i - 1行的元素。故从左向右遍历会破坏元素的状态。
class Solution: def getRow(self, rowIndex: int) -> List[int]: ret = [1] * (rowIndex + 1) for i in range(2, rowIndex + 1): for j in range(i - 1, 0, -1): #倒序取到下标为0的位置,但是不包括0 ret[j] += ret[j - 1] return ret