class Solution(object):
def trap(self, height):
"""
:type height: List[int]
:rtype: int
"""
if len(height) <= 1:
return 0
max_height = 0
max_height_index = 0
# 找到最高点
for i in range(len(height)):
h = height[i]
if h > max_height:
max_height = h
max_height_index = i
area = 0
# 从左边往最高点遍历
tmp = height[0]
for i in range(max_height_index):
if height[i] > tmp:
tmp = height[i]
else:
area = area + (tmp - height[i])
# 从右边往最高点遍历
tmp = height[-1]
for i in reversed(range(max_height_index + 1, len(height))):
if height[i] > tmp:
tmp = height[i]
else:
area = area + (tmp - height[i])
return area
思路:先找到柱子的最高点和最高点的位置,最高点左边和右边分别遍历,如果低于当前值,就加上面积,高于当前值,就更新当前值。
给你一个 m
行 n
列的矩阵 matrix
,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
class Solution(object):
def spiralOrder(self, matrix):
"""
:type matrix: List[List[int]]
:rtype: List[int]
"""
if not matrix:
return None
m, n = len(matrix), len(matrix[0])
# 顺时针方向(右下左上)
dm = [0, 1, 0, -1]
dn = [1, 0, -1, 0]
di = 0 # 方向指针
res = []
x = y = 0 # 位置
for _ in range(m*n): # 最多步长 m*n
res.append(matrix[x][y])
matrix[x][y] = 'v' # 访问过标记为 'v'(‘visited’)
# 下一步位置
x_temp = x + dm[di]
y_temp = y + dn[di]
# 判断下一步位置是否合理,若合理则更新位置,若不合理则改变方向并更新位置
if 0<=x_temp<m and 0<=y_temp<n and matrix[x_temp][y_temp]!='v':
x, y = x_temp, y_temp
else:
di = (di+1) % 4
x += dm[di]
y += dn[di]
return res
给你一个正整数 n
,生成一个包含 1
到 n2
所有元素,且元素按顺时针顺序螺旋排列的 n x n
正方形矩阵 matrix
。
class Solution(object):
def generateMatrix(self, n):
"""
:type n: int
:rtype: List[List[int]]
"""
l, r, t, b = 0, n-1, 0, n-1
mat = [[0 for _ in range(n)] for _ in range(n)]
num, tar = 1, n * n
while num <= tar:
for i in range(l, r + 1): # left to right
mat[t][i] = num
num += 1
t += 1
for i in range(t, b + 1): # top to bottom
mat[i][r] = num
num += 1
r -= 1
for i in range(r, l - 1, -1): # right to left
mat[b][i] = num
num += 1
b -= 1
for i in range(b, t - 1, -1): # bottom to top
mat[i][l] = num
num += 1
l += 1
return mat