数据结构算法基础
CyberXavier
这个作者很懒,什么都没留下…
展开
-
算法基础 -- 区间合并
区间合并问题:给定 n 个区间 [ l , r ],要求合并所有有交集的区间。(如果在端点处相交,也算有交集)输出合并完成后的区间个数。核心思想:首先按每个区间的左端点进行排序,然后再依次处理剩下三种可能存在交集的情况区间1的右端点在区间2左端点的左边(无交集)区间1的右端点在区间2左端点的右边 (有交集)区间1包含区间2 (有交集)注意: 代码中 -2e9 因为 int 的最小值为−2147483647 ~ 2147483647,所以取−2e9 ~ 2e9比较省事,原创 2022-02-12 11:43:44 · 620 阅读 · 0 评论 -
算法基础 -- 区间和
区间和假定有一个无限长的数轴,数轴上每个坐标上的数都是 0。现在,我们首先进行 n 次操作,每次操作将某一位置 x 上的数加 c。接下来,进行 m 次询问,每个询问包含两个整数 l 和 r,你需要求出在区间 [l,r] 之间的所有数的和。输入格式第一行包含两个整数 n 和 m。接下来 n 行,每行包含两个整数 x 和 c。再接下来 m 行,每行包含两个整数 l 和 r。输出格式共 m 行,每行输出一个询问中所求的区间内数字和。数据范围−10 ^9 ≤ x ≤ 10 ^9,原创 2022-02-11 12:05:57 · 811 阅读 · 0 评论 -
算法基础--双指针算法
最长连续不重复子序列核心思想 :遍历数组a中的每一个元素a[i],计算每一个以a[j]开始a[i]结尾的连续子序列的长度,并将长度i - j + 1 与较大的 res 比较并更新(res = max(res, i - j + 1));对于每一个i,如何确定j的位置:由于[j, i - 1]是前一步得到的最长连续不重复子序列,所以如果[j, i]中有重复元素,一定是a[i],因此右移j直到a[i]不重复为止([j, i - 1]已经是前一步的最优解,由于i 和 j 都具有单调性,j不可能左移,所以原创 2022-02-08 15:30:27 · 680 阅读 · 0 评论 -
算法基础 - 差分矩阵
差分矩阵差分数组可以将二维数组的核心操作由O(n*n),变为O(1) 。假设原数组 a[N][N] 是 b[N][N]数组的前缀和,那么b[ ][ ]数组为a[ ][ ]数组的差分数组。构造差分数组与一维差分类似,构造差分数组的目的是为了让原数组a中的子矩阵加上一个数c时所需要的时间复杂度从O(n * n) 优化到O(1)。由于b数组为a数组的差分数组,所以将b[ i ][ j ] 加上一个数c,则原数组a[ i ][ j ]以及之后的数也都会同时加上c。假定差分数组已被构建成功,为了使被原创 2022-02-04 11:41:36 · 1644 阅读 · 0 评论 -
算法基础---差分应用
差分定义 : 给定 a[1], a[2], a[3], …, a[n] 构造差分数组 b[N],使得 a[i] = b[1] + b[2] + … + b[i]核心操作 :将a[L ~ R] 全部加上C , 等价于: b[L] += C , b[R + 1] -= C 时间复杂度是O(1)其中: a[1 ~ L-1] 无影响 、a[L ~ R]加上了C 、a[R+1 , N]无影响#include<iostream>using namespace std;const i原创 2022-02-03 12:13:40 · 952 阅读 · 0 评论 -
算法基础---子矩阵的和(二维前缀和)
子矩阵的和思想(1) S[i, j] 怎么求?公式 : S[i, j] = S[i - 1, j] + S[i, j - 1] - S[i - 1, j - 1] + a[i, j](2) (x1, y1) 和 (x2, y2) 这一子矩阵中所有数的和怎么求?S[x2, y2] - S[x1 - 1, y2] - S[x2, y1 - 1] + S[x1 - 1, y1 - 1]例题:输入一个 n 行 m 列的整数矩阵,再输入 q 个询问,每个询问包含四个整数 x1,y1,x2,y原创 2022-01-28 11:39:01 · 797 阅读 · 0 评论 -
算法基础---高精度除法
高精度除法例题:给定两个非负整数(不含前导 0) A,B,请你计算 A/B 的商和余数。数据范围 :1≤A的长度≤100000 , 1≤B≤10000 , B 一定不为 0输出: 共两行,第一行输出所求的商,第二行输出所求余数。#include<iostream>#include<vector>#include<algorithm>using namespace std;//A除b r为余数 vector<int> div(vect原创 2022-01-27 11:10:33 · 584 阅读 · 0 评论 -
算法基础 --- 高精度乘法
高精度乘法练习题给定两个非负整数(不含前导 0) A 和 B,请你计算 A×B 的值。数据范围: 1≤A的长度≤100000 , 0≤B≤10000模拟:A = 123 , B = 4 , A * B = C , C = 492 = C2C1C0C0 = 2 , C1 = 9 , C2 = 4492 = C2 * 10^2 + C1 * 10 + C0进位数 t 为: t /= 10;#include<iostream>#include<vector>原创 2022-01-27 10:21:37 · 447 阅读 · 0 评论 -
算法基础 --- 高精度减法
高精度减法给定两个正整数(不含前导 0),计算它们的差,计算结果可能为负数。输入格式 : 共两行,每行包括一个正整数。输出格式 : 输出一行,可能结果为负数。思想输入两个字符串,并将两个字符串每一个都减去’0’转换为一个一个的整数,最后存入vector中判断两个数组的大小,保证每次都是较大的数减去较小的数,最后结果为负数则输出时添加“-”进行减法操作:(1)设置一个进位数 t 用来表示是否向前进位,初始值为0;vector A, B,C;(2)从个位数开始计算每次计算结果临时保存到 t原创 2022-01-25 11:53:26 · 358 阅读 · 0 评论 -
算法基础---高精度加法
高精度加法描述给定两个正数计算他们的和1 <= 整数长度 <= 100000思路使用vector存数数据,可以调用size()方法直接获取数字长度将数字一个一个拆分开来并逆序放入vector中例如:1234567放入vector:[7,6,5,4,3,2,1]#include<iostream>#include<vector>using namespace std;vector<int> add(vector<int&原创 2022-01-20 13:57:03 · 463 阅读 · 0 评论 -
算法基础---逆序对数问题
求逆序对数问题问题描述对于数列的第 i 个和第 j 个元素,如果满足 i < j 且 a[i] > a[j],则其为一个逆序对。问题分析可以采用分治法中归并排序的思想来解决问题O(nlogn)将序列从中间分开可以将逆序对分成三种情况:组成逆序对的两个元素都在左边left组成逆序对的两个元素都在右边right组成逆序对的两个元素跨左右两个区间left和right各一个于是就有递归计算左边的逆序数递归计算右边的逆序数递归计算左右跨左右两边的逆序数再把他们累加原创 2022-01-19 14:17:51 · 918 阅读 · 0 评论 -
算法基础---归并排序
归并排序归并排序使用的是分治法的思想,主要有三个步骤:第一步:分解成子问题,确定分界点:mid = (l + r) / 2第二步: 递归处理子问题,递归排序left和right两个区间第三步: 合并子问题,归并两两合二为一输入n个元素的数列进行排序输入样例55 3 4 2 1输出样例1 2 3 4 5#include<iostream>using namespace std;const int N = 1e5 + 10;int n;int q[N], tmp原创 2022-01-19 11:18:02 · 847 阅读 · 0 评论 -
算法基础---快速选择算法
快速选择算法问题使用快速排序算法求出数列从小到大排序后的第k个数。输入格式:第一行两个整数: n(数列中数据个数)和 k(第k个数)第二行输入数列: 包含n个整数输入样例:5 22 3 4 1 7输出样例:2解题思路找到排序算法递归出口快速排序分治思想,将区间划分。比较 k 与 区间的大小,若 k 小于等于左半区间则递归左半区间,反之则递归右半区间。#include<iostream>using namespace std;int n, k;co原创 2022-01-18 11:29:45 · 489 阅读 · 0 评论 -
算法基础--快速排序算法
快速排序基于分治思想求解(一)算法步骤:1.确定分界点:q[l]、q[(l+r)/2]、q[r]随机选取。2.调整区间:使得左半边所有的数小于等于X;右半边所有的数大于等于X;分界点闪上的数为X (X不一定在正中间位置,可能在很奇怪的位置)。3.递归处理左右两区间:设置头尾两个指针遍历数组。(注意结束点)模拟:[3,1,2,3,5]不稳定的算法#include <stdio.h>#include <iostream>using name原创 2022-01-18 10:37:04 · 143 阅读 · 0 评论