AcWing 算法基础课笔记 1.基础算法 |
您所在的位置:网站首页 › acwing算法基础班视频下载 › AcWing 算法基础课笔记 1.基础算法 |
AcWing 算法基础课笔记 1.基础算法
排序快速排序基本思想思路讲解快排模板
归并排序基本思想思路归并模板
二分整数二分基本思想注意点整数二分模板
浮点数二分基本思想浮点数二分模板
高精度前置知识:大整数的存储两个大整数相加高精度加法模板
两个大整数相减注意点高精度减法模板
高精度乘低精度高精度乘低精度模板
高精度除以低精度高精度除以低精度模板
前缀和与差分前缀和基本原理前缀和模板例题
差分基本思想差分模板例题
双指针算法核心思想双指针算法模板
位运算核心思想位运算模板
离散化离散化模板
区间合并区间合并模板
排序
快速排序
基本思想
基于分治。 第一步 确定分界点x:取左边界q[l],或者取中间值q[(l+r)/2],或者取右边界q[r],也可以随机。 第二步 调整区间(较难部分):让小于等于x的数在一个区间,大于x的在另一个区间 平均时间复杂度: O(nlogn) 每层期望是 n/2 ,递归深度 logn,故平均时间复杂度 O(nlogn) 思路讲解思路1(暴力解法,需要额外空间放a b): 一般分四种:(大整数指位数(length)
⩽
\leqslant
⩽ 106。小整数指数值
⩽
\leqslant
⩽ 109, 这里一般考虑
⩽
\leqslant
⩽ 10000) 两个大整数相加:A+B 两个大整数相减:A-B 一个大整数乘以一个小整数:A*a 一个大整数除以一个小整数:A/a (两个大整数相乘相除太复杂不常考,这里不考虑,浮点数也不讲,同样用的少。) 对于一个大整数,通常用数组来存,这里从低位开始存较好。 原因是:因为整数相加要进位,当最高位要进位的时候,我们在数组的末尾使用 push_back() 加一位即可,较方便。反之,在头部加一位要将整个数组后移,较麻烦。 对于存在数组中的两个大整数:A[ ]、B[ ],相加时如下,这里 t 存储进位1: 对于原数组 a1、a2、a3、…、an 前缀和数组 Si = a1 + a2 + a3 + … + ai 定义 S0 = 0 第一个问题:如何求 Si 使用一个 for 循环,递归 S[i] = S[i-1] + ai 第二个问题:前缀和有什么作用? 在计算区间 [ l , r ] 内数的和,若直接使用 for 循环,时间复杂度为 O(n) 但是若使用前缀和,可直接计算 Sr - Sl-1 除了一维数组的计算,也可以推导至二维,计算二维数组中 [ aij, alr ] 的和。 二维前缀和数组一般是从 1 开始而不是 0 。 一维前缀和: S[i] = a[1] + a[2] + ... a[i] a[l] + ... + a[r] = S[r] - S[l - 1]二位前缀和: S[i, j] = 第i行j列格子左上部分所有元素的和 以(x1, y1)为左上角,(x2, y2)为右下角的子矩阵的和为: S[x2, y2] - S[x1 - 1, y2] - S[x2, y1 - 1] + S[x1 - 1, y1 - 1] 例题差分是前缀和的逆运算 即根据给出的前缀和求原数组的值 这里根据 A[ ] 数组,构造 B[ ] 数组,使得 A 是 B 的前缀和 对于二维数组的二维差分 一维差分 给区间[l, r]中的每个数加上c:B[l] += c, B[r + 1] -= c二维差分 给以(x1, y1)为左上角,(x2, y2)为右下角的子矩阵中的所有元素加上c: S[x1, y1] += c, S[x2 + 1, y1] -= c, S[x1, y2 + 1] -= c, S[x2 + 1, y2 + 1] += c 例题对于以往需要双重 for 循环暴力解的题目进行优化 在快排和归并排序中都用到了双指针的思想。 附: 有些较复杂的懒得写特别细,建议AcWing学一下y总的课效果更好。 以上模板、截图均来源:AcWing 的算法基础课 链接:https://www.acwing.com/blog/content/277/ |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |