数据结构与算法
学习
anieoo
这个作者很懒,什么都没留下…
展开
-
刷题时经常面临的向上和向下取整
如果求m + n的平均数向上取整即 a = m + n b = 2;如果求m + n的平均数,即a = m + n, b = 2。原创 2022-08-22 15:17:39 · 464 阅读 · 0 评论 -
150. 逆波兰表达式求值
原题链接:150. 逆波兰表达式求值solution: ① 遇到数字就存入栈中 ② 遇到计算符号,就从栈顶选取两个数计算,再存入栈中 ③ 返回最后的栈顶元素class Solution {public: int evalRPN(vector<string>& tokens) { stack<int> stk; for(auto &c : tokens) { ...原创 2022-05-24 09:45:25 · 119 阅读 · 0 评论 -
225. 用队列实现栈
原题链接:225. 用队列实现栈solution: 用队列模拟栈,由于队列只能在末尾进入,开头出,每次pop,和top复杂度都是O(n)class MyStack {public: queue<int> que; MyStack() { } void push(int x) { que.push(x); } int pop() { int res = 0; ...原创 2022-05-23 12:11:39 · 103 阅读 · 0 评论 -
32. 最长有效括号
原题链接:32. 最长有效括号solution: 利用栈进行匹配,遍历字符串s时,只有两种情况'('或')'①当s[i]为'('的时候,将其对应的下标存入栈中②当s[i]为')'的时候,将栈顶弹出,相当于有一组有效的括号,若弹出的时候栈为空代表这个位置是一个无效')'括号,标记sta[i]为true.③当遍历玩字符串的时候,若栈不为空,将栈内存储的所有下标i,都标记为true,因为这些都是无效'('class Solution {public: int lo...原创 2022-05-20 17:27:22 · 117 阅读 · 0 评论 -
动态规划:分组背包问题
ACwing 9.和01背包类似#include <iostream>using namespace std;const int N=110;int f[N][N]; //只从前i组物品中选,当前体积小于等于j的最大值int v[N][N],w[N][N],s[N]; //v为体积,w为价值,s代表第i组物品的个数int n,m,k;int main(){ cin>>n>>m; for(int i=1;i<.原创 2022-04-22 17:59:42 · 902 阅读 · 0 评论 -
动态规划:多重背包问题
ACwing 4.多重背包问题I一、状态表示f[i][j],表示从前i个物品当中选,总体积不超过j的选法,求解的是最大值二、集合划分f[i][j]根据第i见物品选择的数量进行划分,f[i-1][j],f[i-1][j-v]+w,f[i-1][j-2*v]+2 * w....三、转移方程f[i][j] = max(f[i][j],f[i-1][j-kv] + k * w)代码:#include <iostream>using namespac...原创 2022-04-22 14:44:23 · 4456 阅读 · 0 评论 -
动态规划:完全背包问题
ACwing #3. 完全背包问题完全背包问题和01背包问题很相似。01背包问题每个物品只能选一个,而完全背包问题每个物品可以选无限次。DP问题的关键是找到状态转移方程:①定义f[i][j]表示从前 i 个物品中选择,体积为 j 的时候的最大价值。②那么f[i][j] = max(f[i - 1][j],f[i - 1][j - v[i]],f[i - 1][j - 2 * v[i]],.....,f[i - 1][j - k * v[i]],....)因此代码就是:#incl原创 2022-04-21 17:53:38 · 5380 阅读 · 2 评论 -
707. 设计链表
原题链接:707. 设计链表solution:class MyLinkedList {public: struct ListNode { int val; ListNode *next; //下一个节点 ListNode(int val):val(val),next(nullptr){} }; MyLinkedList() { dummyhead = new ListNode(-1); .原创 2022-04-20 15:51:14 · 89 阅读 · 0 评论 -
拓扑排序例题
拓扑序列是顶点活动网中将活动按发生的先后次序进行的一种排列。 拓扑排序,是对一个有向无环图G进行拓扑排序,是将G中所有顶点排成一个线性序列。拓扑排序:算法流程: ①用队列来执行 ,初始化讲所有入度为0的顶点入队。 ②主要由以下两步循环执行,直到不存在入度为 0 的顶点为止 ③选择一个入度为 0 的顶点,并将它输出;删除图中从顶点连出的所有边。循环结束, ④若输出的顶点数小于图中的顶点数,则表示该图存在回路,即无法拓扑排序,否...原创 2022-04-12 20:00:46 · 1117 阅读 · 0 评论 -
中缀表达式求值
ACWing 3302.表达式求值“表达式求值”问题,两个核心关键点:(1)双栈,一个操作数栈,一个运算符栈;(2)运算符优先级,栈顶运算符,和,即将入栈的运算符的优先级比较:如果栈顶的运算符优先级低,新运算符直接入栈如果栈顶的运算符优先级高,先出栈计算,新运算符再入栈#include <iostream>using namespace std;#include <stack>#include <unordered_map>unor原创 2022-04-10 19:03:07 · 86 阅读 · 0 评论 -
705. 设计哈希集合 706. 设计哈希映射
两题的功能分别是实现unordered_set 和 unordered_map;由于包含删除操作所以采用拉链法设计原题链接:706. 设计哈希映射705. 设计哈希集合solution:const int N = 20003;class MyHashSet {public: vector<int> h[N]; int find(vector<int> &h, int key) { ...原创 2022-04-10 11:33:08 · 153 阅读 · 0 评论 -
树的基本概念
一、树的节本概念1.1 树的定义 空树:节点数为0的树 叶子结点:没有后继的节点 分支节点:有后继的节点###任何节点有且仅有一个前驱1.2 基本术语1. 结点的层次(深度)——从上往下2. 结点的高度——从下往上3. 树的高度——总共多少层4.结点的度——有几个孩子5.树的度——各结点的度的最大值1.3 树的性质二、二叉树的基本概念 ...原创 2022-04-04 15:21:40 · 1981 阅读 · 0 评论 -
含头节点单链表(初始化、插入、删除、查询)
一、单链表的创建结点的定义typedef struct LNode{ int data; struct LNode *next;}LNode, *LinkList; //声明一个节点可以使用 LNode *node; LinkList L;初始化一个单链表//初始化一个单链表(包含头节点)bool InitList(LinkList &L){ L = (LNode *) malloc(sizeof(LNode)); ...原创 2022-03-29 11:48:40 · 3630 阅读 · 0 评论 -
二分查找算法
一、算法模板bool check(int x) {/* ... */} // 检查x是否满足某种性质// 区间[l, r]被划分成[l, mid]和[mid + 1, r]时使用:int bsearch_1(int l, int r){ while (l < r) { int mid = l + r >> 1; if (check(mid)) r = mid; // check()判断mid是否满足性质 e原创 2022-02-20 22:47:39 · 161 阅读 · 0 评论 -
快速排序算法
一、算法模板void quick_sort(int q[],int l,int r){ if(l>=r)return; int x = q[l+r>>1],i=l-1,j=r+1; while(i<j){ do i++;while(q[i]<x); do j--;while(q[j]>x); if(i<j)swap(q[i],q[j]); } quick_原创 2022-02-18 21:47:06 · 421 阅读 · 0 评论 -
归并排序算法
一、算法模板void merge_sort(int q[], int l, int r){ if (l >= r) return; //临界条件 int mid = l + r >> 1; merge_sort(q, l, mid); merge_sort(q, mid + 1, r); int k = 0, i = l, j = mid + 1; while (i <= mid && j <=原创 2022-02-23 23:28:01 · 144 阅读 · 0 评论 -
十大经典排序算法(动图演示)
十大经典排序算法(动图演示) - 一像素 - 博客园转载 2022-02-20 20:07:51 · 155 阅读 · 0 评论 -
堆排序算法
一、算法模板 ##小根堆模板 大根堆只需要修改down和up// h[N]存储堆中的值, h[1]是堆顶,x的左儿子是2x, 右儿子是2x + 1// ph[k]存储第k个插入的点在堆中的位置// hp[k]存储堆中下标是k的点是第几个插入的int h[N], ph[N], hp[N], size;// 交换两个点,及其映射关系void heap_swap(int a, int b){ swap(ph[hp[a]],ph[hp[b]]); ...原创 2022-03-05 11:43:25 · 114 阅读 · 0 评论 -
KMP算法(分析、例题)
ACWing #831算法题目,一般是先考虑暴力解决的方法,在通过分析暴力方法中的步骤,看看如何优化时间复杂度。题目分析:给定一个模式字符串S[],和一个模板子串P[],S长度大于等于子串P,求解子串P能否在模式串S中匹配,并返回每次匹配的起始下标位置。暴力做法:首先思考如何用暴力算法解决这个问题。主要的思想是在主串的[0, n-m]区间内依次截取长度为m的子串,看子串是否和模式串一样(n是主串的长度,m是子串的长度)。举个例子如下:给定文本串S,“aaa...原创 2022-03-02 11:52:51 · 621 阅读 · 0 评论 -
双指针算法模板
for (int i = 0, j = 0; i < n; i ++ ){ while (j < i && check(i, j)) j ++ ; // 具体问题的逻辑}常见问题分类: (1) 对于一个序列,用两个指针维护一段区间 (2) 对于两个序列,维护某种次序,比如归并排序中合并两个有序序列的操作...原创 2022-02-27 23:15:48 · 89 阅读 · 0 评论 -
001.最长连续不重复子序列
ACWing #799给定一个长度为 n 的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。输入格式第一行包含整数 n。第二行包含 n 个整数(均在 0~10^5范围内),表示整数序列。输出格式共一行,包含一个整数,表示最长的不包含重复的数的连续区间的长度。数据范围1≤n≤1051≤n≤105输入样例:51 2 2 3 5输出样例:3思路: 如果采用暴力算法,需要遍历2次循环时间复杂度为O(n^2),并...原创 2022-02-27 21:34:39 · 153 阅读 · 0 评论 -
002.数组元素的目标和
ACwing #800给定两个升序排序的有序数组 A 和 B,以及一个目标值 x。数组下标从 00 开始。请你求出满足 A[i]+B[j]=xA[i]+B[j]=x 的数对 (i,j)。数据保证有唯一解。输入格式第一行包含三个整数 n,m,,x,分别表示 A 的长度,B 的长度以及目标值 x。第二行包含 n 个整数,表示数组 A。第三行包含 m 个整数,表示数组 B。输出格式共一行,包含两个整数 i和 j。数据范围数组长度不超过 10^5。同一数组内元素各不转载 2022-02-27 21:48:08 · 346 阅读 · 0 评论 -
顺序表的定义(静态、动态、增加、删除)
顺序表的特点:随机访问,可以在O(1)时间内找到第i个元素。 存储密度高,每个节点只存储数据元素 拓展容量不方便 插入、删除操作不方便,需要移动大量元素一、顺序表的静态创建利用静态分配的方式定义一个顺序表#define Maxsize 20 //宏定义静态分配的最大长度为20typedef struct sq{ int data[Maxsize]; //静态数组存放元素 int length; //定义当前长度}SqList;...原创 2022-03-28 12:24:57 · 562 阅读 · 0 评论 -
数据结构笔记
1、时间复杂度2、空间复杂度 3、线性表定义原创 2022-03-27 11:28:12 · 578 阅读 · 0 评论 -
动态规划:01背包问题
一、什么是01背包问题?举个例子,你要去一个水果摊拿水果,每种水果都有对应的两种属性:占用的体积V和蕴含的价值W。而你的背包体积为N。老板说:每种水果只能拿一个!因此对于咱们肯定得想一种搭配方式使得拿的水果总体积不超过背包容积,但是价值总和达到最大! 核心思想: f[i][j]:表示所有选法集合中,只从前i个物品中选,并且总体积不大于j的选法的集合,它的值是这个集合中每一个选法的最大值。 对于01背包问题选择方法的集合可以分成2种:...原创 2022-03-16 21:48:41 · 72583 阅读 · 10 评论 -
算法题常用STL笔记
vector(变长数组),倍增的思想,支持比较运算(按字典序) 定义:: vector <int> a; 定义:一个vector数组a vector <int> a(10); 定义:一个长度为10的vector数组a vector <int> a(10,3); 定义:一个长度为10的vector数组a,并且所有元素都为3 常用函数:: size(); 返回元素个数 empty(...原创 2022-03-04 17:26:21 · 187 阅读 · 0 评论 -
KMP算法(分析、例题)
ACWing #831算法题目,一般是先考虑暴力解决的方法,在通过分析暴力方法中的步骤,看看如何优化时间复杂度。题目分析:给定一个模式字符串S[],和一个模板子串P[],S长度大于等于子串P,求解子串P能否在模式串S中匹配,并返回每次匹配的起始下标位置。暴力做法:首先思考如何用暴力算法解决这个问题。主要的思想是在主串的[0, n-m]区间内依次截取长度为m的子串,看子串是否和模式串一样(n是主串的长度,m是子串的长度)。举个例子如下:给定文本串S,“aaa...原创 2022-03-02 11:52:51 · 621 阅读 · 0 评论 -
002.输出二进制中1的个数
ACwing #801给定一个长度为 nn 的数列,请你求出数列中每个数的二进制表示中 11 的个数。输入格式第一行包含整数 nn。第二行包含 nn 个整数,表示整个数列。输出格式共一行,包含 nn 个整数,其中的第 ii 个数表示数列中的第 ii 个数的二进制表示中 11 的个数。数据范围1≤n≤1000001≤n≤100000,0≤数列中元素的值≤1090≤数列中元素的值≤109输入样例:51 2 3 4 5输出样例:1 1 2 ...原创 2022-02-27 20:22:10 · 264 阅读 · 0 评论 -
c++算法头文件
万能头文件#include <bits/stdc++.h> using namespace std; 完整头文件 #include <stdio.h> #include <string.h> #include <math.h> #include <stdlib.h> #include <time.h> #include <algorithm> #include <iostr原创 2022-02-24 17:24:03 · 2019 阅读 · 0 评论 -
归并排序算法
一、算法模板void merge_sort(int q[], int l, int r){ if (l >= r) return; //临界条件 int mid = l + r >> 1; merge_sort(q, l, mid); merge_sort(q, mid + 1, r); int k = 0, i = l, j = mid + 1; while (i <= mid && j <=原创 2022-02-23 23:28:01 · 144 阅读 · 0 评论 -
二分查找算法
一、算法模板bool check(int x) {/* ... */} // 检查x是否满足某种性质// 区间[l, r]被划分成[l, mid]和[mid + 1, r]时使用:int bsearch_1(int l, int r){ while (l < r) { int mid = l + r >> 1; if (check(mid)) r = mid; // check()判断mid是否满足性质 e原创 2022-02-20 22:47:39 · 161 阅读 · 0 评论 -
快速排序算法
一、算法模板void quick_sort(int q[],int l,int r){ if(l>=r)return; int x = q[l+r>>1],i=l-1,j=r+1; while(i<j){ do i++;while(q[i]<x); do j--;while(q[j]>x); if(i<j)swap(q[i],q[j]); } quick_原创 2022-02-18 21:47:06 · 421 阅读 · 0 评论