当前位置: 首页 > news >正文

304. 前缀和技巧中的边界值处理

文章目录

  • 题目
  • 问题
  • 反思

题目

题目如下,其实并不难,属于小而美的前缀和技巧中的体型。因为我之前做过这道题,所以重刷也马上就能写。但是对比我写的和之前看别人写的,明显我的代码不够简洁,一个核心的差异在于对DP数组的定义上。

在这里插入图片描述

问题

先看下我的代码,我对DP数组的定义是:存储以(0,0)为起点,到(i, j)的数组之和。提交代码显示超出时间限制。

两个问题:

  1. 边界条件处理贼麻烦,我自己写的时候也注意到了;(但这不是导致超时的原因)
  2. 处理超时,因为我每次要算一遍DP。
class NumMatrix:def __init__(self, matrix: List[List[int]]):self.matrix = matrixdef sumFromLeftCorner(self):R, C = len(self.matrix), len(self.matrix[0])dp = [[0 for j in range(C)] for i in range(R)]for i in range(R):for j in range(C):if i == 0 and j == 0:dp[i][j] = self.matrix[i][j]elif i == 0:dp[i][j] = dp[i][j-1] + self.matrix[i][j]elif j == 0:dp[i][j] = dp[i-1][j] + self.matrix[i][j]else:dp[i][j] = dp[i-1][j] + dp[i][j-1] - dp[i-1][j-1] + self.matrix[i][j]return dpdef sumRegion(self, row1: int, col1: int, row2: int, col2: int) -> int:dp = self.sumFromLeftCorner()if row1 == 0 and col1 == 0:return dp[row2][col2]elif row1 == 0:return dp[row2][col2] - dp[row2][col1 - 1]elif col1 == 0:return dp[row2][col2] - dp[row1 - 1][col2]else:return dp[row2][col2] - dp[row1-1][col2] - dp[row2][col1-1] + dp[row1-1][col1-1]

反思

对于第一个问题:

  1. 边界条件处理贼麻烦,我自己写的时候也注意到了;(但这不是导致超时的原因)

只要改一下DP数组的定义即可:存储以(0,0)为起点,到(i-1, j-1)的数组之和。因此DP数组的长宽都要加1;

对于第二个问题:

  1. 处理超时,因为我每次要算一遍DP。

将DP数组计算的过程放在__init__下面,总是只计算一次,然后重复调用其结果即可/

修改以后的代码如下,明显简洁很多!

class NumMatrix:def __init__(self, matrix: List[List[int]]):self.matrix = matrixself.dp = self.sumFromLeftCorner()def sumFromLeftCorner(self):R, C = len(self.matrix), len(self.matrix[0])dp = [[0 for j in range(C+1)] for i in range(R+1)]for i in range(1, R+1):for j in range(1, C+1):dp[i][j] = dp[i-1][j] + dp[i][j-1] - dp[i-1][j-1] + self.matrix[i-1][j-1]return dpdef sumRegion(self, row1: int, col1: int, row2: int, col2: int) -> int:return self.dp[row2+1][col2+1] - self.dp[row1][col2+1] - self.dp[row2+1][col1] + self.dp[row1][col1]
http://www.lryc.cn/news/334690.html

相关文章:

  • ios swift5 “Sign in with Apple“(使用苹果登录)怎样接入(第三方登录)集成AppleID登录
  • 时间系列预测总结
  • NineData创始人CEO叶正盛受邀参加『数据技术嘉年华』的技术大会
  • nginx访问路径映射资源目录
  • 数据挖掘|序列模式挖掘及其算法的python实现
  • 3. Django 初探路由
  • 论文笔记:Large Language Models as Analogical Reasoners
  • 第3章 数据定义语言DDL
  • C#操作MySQL从入门到精通(7)——对查询数据进行简单过滤
  • 【CVE复现计划】CVE-2024-0195
  • k8s的ca以及相关证书签发流程
  • 思迈特软件与上海德拓签署战略合作协议,携手赋能企业数字化转型
  • 【快捷部署】015_Minio(latest)
  • <网络安全>《72 微课堂<什么是靶场?>》
  • Golang | Leetcode Golang题解之第18题四数之和
  • 自动驾驶中的传感器融合算法:卡尔曼滤波器和扩展卡尔曼滤波器
  • 基于ssm的星空游戏购买下载平台的设计与实现论文
  • DSOX6004A是德科技DSOX6004A示波器
  • golang 使用 cipher、aes 实现 oauth2 验证
  • LLMs之FreeGPT35:FreeGPT35的简介、安装和使用方法、案例应用之详细攻略
  • 【力扣一刷】代码随想录day32(贪心算法part2:122.买卖股票的最佳时机II、55. 跳跃游戏、45.跳跃游戏II )
  • 安卓远离手机app
  • yolov5旋转目标检测遥感图像检测-无人机旋转目标检测(代码和原理)
  • 云手机提供私域流量变现方案
  • 树的基本概念与二叉树
  • 什么是物理服务器?
  • 数据结构:详解【树和二叉树】
  • “成像光谱遥感技术中的AI革命:ChatGPT在遥感领域中的应用“
  • semhear环境sox
  • 如何快速开启一个项目-ApiHug - API design Copilot