| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 算法笔记(五)——小而美的算法技巧—前缀和 -> 正文阅读 |
|
[数据结构与算法]算法笔记(五)——小而美的算法技巧—前缀和 |
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??? ? 一维数组中的前缀和先看一道例题,力扣第303题。 区域和检索——数组不可变没学过前缀和之前我们都会这样写。
这样写没问题,但是效率很低,sumRange会被频繁的调用,时间复杂度为O(n)。 而这道题如果利用前缀和来解题,时间复杂度就会降到O(1). 简单先介绍下前缀和:核心思想就是,创建一个新数组sum出来,用sum[i]记录num[0,1,,,,i-1]的和。 ?如果我们想求索引区间[1,3]内所有元素的和,S[4]-s[1]就可以得出来,这样只需要做一次减法就可以得出来结果避免了多次for循环的调用,时间复杂度为O(1). 优化后的代码:
趁热打铁再试一题:
前面我有一篇关于蓝桥杯的博客,里面的K倍区间就是对前缀和的应用,不过那道题对前缀和做了优化,想深入了解的可以看下:蓝桥杯——2017第八届C/C++真题[省赛][B组]_skeet follower的博客-CSDN博客 二维矩阵中的前缀和
步骤一:求 preSum 我们定义 preSum[i][j]preSum[i][j] 表示 从 [0,0][0,0] 位置到 [i,j][i,j] 位置的子矩形所有元素之和。 S(O, D) = S(O, C) + S(O, B) - S(O, A) + D 减去 S(O, A)S(O,A) 的原因是 S(O, C)S(O,C) 和 S(O, B)S(O,B) 中都有 S(O, A)S(O,A),即加了两次 S(O, A)S(O,A),所以需要减去一次 S(O, A)S(O,A)。 如果求 preSum[i][j]preSum[i][j] 表示的话,对应了以下的递推公式: preSum[i][j] = preSum[i - 1][j] + preSum[i][j - 1] - preSum[i - 1][j - 1] + matrix[i][j] 前面已经求出了数组中从 [0,0][0,0] 位置到 [i,j][i,j] 位置的 preSum。下面要利用 preSum[i][j]preSum[i][j] 来快速求出任意子矩形的面积。 同样利用一张图来说明: S(A, D) = S(O, D) - S(O, E) - S(O, F) + S(O, G) 加上子矩形 S(O, G)S(O,G) 面积的原因是 S(O, E)S(O,E) 和 S(O, F)S(O,F) 中都有 S(O, G)S(O,G),即减了两次 S(O, G)S(O,G),所以需要加上一次 S(O, G)S(O,G)。 如果要求 [row1, col1][row1,col1] 到 [row2, col2][row2,col2] 的子矩形的面积的话,用 preSum 对应了以下的递推公式: preSum[row2][col2] - preSum[row2][col1 - 1] - preSum[row1 - 1][col2] + preSum[row1 - 1][col1 - 1] 二维区域和检索——矩阵不可变? ?代码
? ?代码
? |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 5:25:07- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |