leetcode-explore-learn-数据结构-数组2
- 1.简述
- 2.例题
- 2.1 二维数组的对角线遍历
- 2.2 螺旋遍历
- 2.3 杨辉三角
本系列博文为leetcode-explore-learn子栏目学习笔记,如有不详之处,请参考leetcode官网:https://leetcode-cn.com/explore/learn/card/array-and-string/198/introduction-to-array/768/
1.简述
本文主要记录二维数据及相关的例题
二维数组的元素排列在矩形网格中,而不是直线上
在一些语言中,二维数组内部实际是使用一维数组实现的–c++中a[i] [j]内部索引时,实际为a[i*n+j] (n为每一行元素的个数)
与一维动态数组类似,一样可以定义二维动态数组,实际上,他可以只是一个嵌套的动态数组。
2.例题
2.1 二维数组的对角线遍历
同一条对角线上元素下标索引和一致。
n*m的矩阵一共有n+m-1条对角线
索引和为偶数时,向上遍历,遍历顺序是(x,0)(x-1,1),(x-2,2),…,(0,x)
索引和为奇数时,向下遍历,遍历顺序为(0,y),(1,y-1),…,(y,0)
28/32
class Solution(object):def findDiagonalOrder(self, matrix):""":type matrix: List[List[int]]:rtype: List[int]"""if not matrix:return []hor = len(matrix)ver = len(matrix[0])leng = hor+ver-1listmatrix = []for x in range(leng+1):if x%2 ==0:for i in range(x,-1,-1):j = x-iif i<hor and j<ver:listmatrix.append(matrix[i][j])elif j>ver:continueelse:for j in range(x,-1,-1):i = x-jif i<hor and j<ver:listmatrix.append(matrix[i][j])elif j>hor:continuereturn listmatrix
参考博文:https://blog.csdn.net/qq_36022260/article/details/103651894
2.2 螺旋遍历
leetcode 54
class Solution(object):def spiralOrder(self, matrix):""":type matrix: List[List[int]]:rtype: List[int]"""if not matrix:return []R,C=len(matrix),len(matrix[0])flag=[[False]*C for _ in matrix]res=[]dr=[0,1,0,-1] # [r+0,c+1] 表征顺时针的四个方向dc=[1,0,-1,0]r,c=0,0di=0for _ in range(R*C):res.append(matrix[r][c])flag[r][c]=Truen_r,n_c=r+dr[di],c+dc[di]if 0<=n_r<R and 0<=n_c<C and not flag[n_r][n_c]:r,c=n_r,n_celse:di=(di+1)%4r,c=r+dr[di],c+dc[di]return res
2.3 杨辉三角
第i行的元素个数为i+1个,i的取值范围为0,1,…,numRows-1
第i行元素的第一个元素(索引为0)和最后一个元素(索引为i),该行中其它元素的索引j取值范围为0,1,…,i-1.
class Solution(object):def generate(self, c):""":type numRows: int:rtype: List[List[int]]"""res=[]for i in range(numRows):if i==0:res.append([1])elif i==1:res.append([1,1])else:res.append([1]*(i+1)) for j in range(1,i):res[i][j]=res[i-1][j-1]+res[i-1][j]return res