数组、链表类
下面的内容是根据labuladong的算法笔记进行学习的,因为其labuladong的算法套路真的是很nice,所以就想把自己学的过程记录下来,方便后面进行复习。
前缀和求数组
适用于 快速、频率计算一个索引区间内元素之和
方法原理:数组前缀和的最基本原理是----穷举,前缀和说的是对原数组这部分不断进行累加。
a、创建一个新数组persum,数组比所求原数组长度+1
b、persum[0] = 0,persum后面每一个是原数组的累加/减的结果
c、若求某区间[0,3]的和,只需要使用persum[4]-persum0]即可。
根据前缀和总结套路得出:
class NumArray:
def __init__(self, nums: List[int]):
self.perSum = [0] * (len(nums)+1)//创建一个比nums长度+1 的数组且数组下标为0 的是0
# self.perSum[0] = 0
for i in range(len(nums))://从下标为1 开始的数组中的数值为其累加和
self.perSum[i+1] = self.perSum[i] + nums[i]//理解为persum[1] = persum[0]+nums[0],计算前缀和数组的步骤,不断的累计
def sumRange(self, left: int, right: int) -> int:
perSum = self.perSum
return perSum[right+1] -perSum[left]//求区间和等于right+1 -left
二维矩阵前缀和
leetcode304 二维区域和检索–矩阵不可变
这个和前面前缀和思路相同:
1、先建立一个一个是(m+1)*(n+1)的二位矩阵persum;
2、计算从原点到不同坐标的的矩阵和,进行累加;
3、最后计算相关区域的值得大小,若计算某区域的值,persum是从原点到不同的坐标点的和相加获得。可以理解为下图中最大的绿色部分减去蓝色部分在减去橙色部分最后加上粉红色的部分,最后可以算出大红色部分的值
class NumMatrix:
def __init__(self, matrix: List[List[int]]):
m = len(matrix)
n = len(matrix[0] if matrix else 0)
# if n == 0 or m == 0: return;
self.persum = [[0] * (n + 1) for _ in range(m + 1)]
persum = self.persum #存放的矩阵是从原点到各区间的值,可以理解为[0,0,i,j]和的值
for i in range(m):
for j in range(n):
persum[i+1][j+1] = persum[i+1][j] + persum[i][j + 1] + matrix[i][j] - persum[i][j]#这一步可以对比上图中的方框感受一下,计算其前缀和的方法类似
def sumRegion(self, row1: int, col1: int, row2: int, col2: int) -> int:
persum = self.persum
return persum[row2 + 1][col2 + 1] - persum[row1][col2 + 1] - persum[row2 + 1][col1] + persum[row1][col1]