leetcode刷题----一天一个刷题套路

数组、链表类

下面的内容是根据labuladong的算法笔记进行学习的,因为其labuladong的算法套路真的是很nice,所以就想把自己学的过程记录下来,方便后面进行复习。

前缀和求数组

适用于 快速、频率计算一个索引区间内元素之和

方法原理:数组前缀和的最基本原理是----穷举,前缀和说的是对原数组这部分不断进行累加。

a、创建一个新数组persum,数组比所求原数组长度+1

b、persum[0] = 0,persum后面每一个是原数组的累加/减的结果

c、若求某区间[0,3]的和,只需要使用persum[4]-persum0]即可。

leetcode303 区域和检测—数组不可变

根据前缀和总结套路得出:

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]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值