算法模板笔记
文章平均质量分 50
Andy in boots
一个有故事的程序猿
展开
-
【算法模板】利用维护栈实现二叉搜索树的迭代器
原题 1305. 两棵二叉搜索树中的所有元素我们可以利用栈这种数据结构保存每一个二叉搜索树中序遍历的当前状态可以直接对这两个栈进行判断与操作这里我参考评论区思路封装了一个迭代器,这样主函数的逻辑就比较清晰代码:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() :原创 2022-05-01 15:50:43 · 375 阅读 · 0 评论 -
线段树与树状数组
树状数组优点:代码短,运行效率高(大部分情况下与线段树相比大约差10倍),支持修改(在线做法)能用树状数组做的尽量别用线段树(杀鸡不用牛刀)解决问题:动态快速求前缀和(O(logn))给某个位置上的数加一个数(单点修改)快速求前缀和(区间查询)个人理解:在某些情况下,需要实现对序列中进行区间增加(差分能做到),之后再进行查询(前缀和能做到),但是前缀和是离线的不支持修改,而差分又不能很快的求出区间和,因此引出了这种方法。构造方法:维护一个和原数组a[n]一样长的数组(注意这里下标是从原创 2022-04-04 13:45:29 · 769 阅读 · 0 评论 -
【算法】排序算法总结(附演示图+代码)
冒泡排序(Bubble Sort)插入排序(Insertion Sort)希尔排序(Shell Sort)选择排序(Selection Sort)快速排序(Quick Sort)归并排序(Merge Sort)堆排序(Heap Sort)计数排序(Counting Sort)桶排序(Bucket Sort)基数排序(Radix Sort)...原创 2021-08-19 22:08:29 · 1710 阅读 · 0 评论 -
【数论知识】2:欧拉函数
欧拉函数:在数论中,对正整数n,欧拉函数是1~n中与n互质的数的个数,记作φ(n) 。公式:例如:n=6=23则φ(n) =n(1-1/2)*(1-1/3)=2证明:利用容氏原理进行证明从1~n中去掉p1,p2,…,pk的所有倍数,即:r1=n-n/p1-n/p2-…-n/pk由于多去除了部分公共倍数,因此要加上加上所有pipj的倍数,即:r2=r1+n/(p1p2)+n/(p1p3)+…+n/(pk-1pk)减去所有pipjpk的倍数,即r3=r2-n/(p1p2p3)-n/(p1p原创 2021-08-14 13:12:44 · 785 阅读 · 0 评论 -
KMP算法的两种模板
个人感觉这种比较好理解例题leetcodeclass Solution {public: int strStr(string haystack, string needle) { if(!needle.size()) return 0; int szn = needle.size(),szh = haystack.size(); vector<int> nex; nex.push_back(0); in原创 2021-04-20 12:51:15 · 143 阅读 · 0 评论 -
【leetcode】剑指offer 26. 树的子结构,利用递归进行匹配
原题传送门利用递归对于A树进行前序遍历,在前序遍历的同时匹配B树,发现成功后返回true,否则返回false/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */clas原创 2021-03-27 16:22:16 · 146 阅读 · 0 评论 -
【Leetcode】剑指Offer 04. 二维数组中的查找 :利用二分快速查找有序数列
看到这道的第一时间就想到了二分,因为:数据的存储形式是数组,可以支持随机访问数据有序排列,有内部规律所以我们利用二分对这个过程进行优化class Solution {public: bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) { // 这道题肯定不可暴力遍历,看到有序查找,第一时间用二分。 // 大致思路是:单行的查找用二分加速原创 2021-03-24 12:23:20 · 146 阅读 · 0 评论 -
飞行员兄弟,四种ac代码
题目描述:“飞行员兄弟”这个游戏,需要玩家顺利的打开一个拥有16个把手的冰箱。已知每个把手可以处于以下两种状态之一:打开或关闭。只有当所有把手都打开时,冰箱才会打开。把手可以表示为一个4х4的矩阵,您可以改变任何一个位置[i,j]上把手的状态。但是,这也会使得第i行和第j列上的所有把手的状态也随着改变。请你求出打开冰箱所需的切换把手的次数最小值是多少。输入格式输入一共包含四行,每行包含四个把手的初始状态。符号“+”表示把手处于闭合状态,而符号“-”表示把手处于打开状态。至少一个手柄的初始原创 2021-03-21 12:40:02 · 825 阅读 · 0 评论 -
寄!最能体现迭代思想的一道题,反转链表!【C++】
读完本文,你可以去力扣拿下如下题目:92.反转链表II反转单链表的迭代实现不是一个困难的事情,但是递归实现就有点难度了,如果再加一点难度,让你仅仅反转单链表中的一部分,你是否能够递归实现呢?本文就来由浅入深,step by step 地解决这个问题。如果你还不会递归地反转单链表也没关系,本文会从递归反转整个单链表开始拓展,只要你明白单链表的结构,相信你能够有所收获。// 单链表节点的结构public class ListNode { int val; ListNode next;原创 2021-03-18 20:28:45 · 160 阅读 · 0 评论 -
根据时间复杂度为不同题目选择算法
一般ACM或者笔试题的时间限制是1秒或2秒。在这种情况下,C++代码中的操作次数控制在 1e7∼1e8 为最佳。下面给出在不同数据范围下,代码的时间复杂度和算法该如何选择:原创 2021-03-16 12:02:16 · 247 阅读 · 0 评论 -
【数论知识】1:和1-n中的所有质数有关的算法(朴素版+升级版)
可以先记一下结论是一个数学界推出来的,不知道为什么,记住就行1-N里面有N/lnN个质数朴素筛法(埃氏)思想是用每个质数去筛除以它为约数的合数。每个质数都要做一遍。#include <iostream>#include <algorithm>using namespace std;const int N = 1e6;bool st[N]; //判断有没有被筛掉int cnt = 0,primes[N];void get_res(int x){ f原创 2021-03-15 16:11:27 · 722 阅读 · 0 评论 -
c++优先队列的用法 (priority_queue)
既然是队列那么先要包含头文件#include , 他和queue不同的就在于我们可以自定义其中数据的优先级, 让优先级高的排在队列前面,优先出队优先队列具有队列的所有特性,包括基本操作,只是在这基础上添加了内部的一个排序,它本质是一个堆实现的和队列基本操作相同:top 访问队头元素empty 队列是否为空size 返回队列内元素个数push 插入元素到队尾 (并排序)emplace 原地构造一个元素并插入队列pop 弹出队头元素swap 交换内容定义:priority_queue...原创 2021-03-03 17:27:46 · 139 阅读 · 2 评论 -
C++提高算法速度的方法
在竞赛中,遇到大数据时,往往读文件成了程序运行速度的瓶颈,需要更快的读取方式。相信几乎所有的C++学习者都在cin机器缓慢的速度上栽过跟头,于是从此以后发誓不用cin读数据。还有人说Pascal的read语句的速度是C/C++中scanf比不上的,C++选手只能干着急。难道C++真的低Pascal一等吗?答案是不言而喻的。一个进阶的方法是把数据一下子读进来,然后再转化字符串,这种方法传说中很不错,但具体如何从没试过,因此今天就索性把能想到的所有的读数据的方式都测试了一边,结果是惊人的。竞赛中读数据的情况最原创 2021-01-10 22:19:33 · 1414 阅读 · 0 评论 -
二分问题模板
有单调性的题目一定可以二分,但是二分不一定是用于有单调性的题目。二分是把整个区间分为两部分,一部分满足某种性质,另一部分不满足某种性质。二分模板一共有两种,分别适用于不同情况。算法思路:假设目标值在闭区间[l, r]中, 每次将区间长度缩小一半,当l = r时,我们就找到了目标值。1.当我们将区间[l, r]划分成[l, mid]和[mid + 1, r]时,其更新操作是r = mid或者l = mid + 1;,计算mid时不需要加1mid是偏l呢一边,r在转换时会改变,从而不会造成死循环。i原创 2021-01-09 23:02:57 · 215 阅读 · 3 评论 -
货仓选址问题
文章目录题目输入格式输出格式数据范围笔记做法:拓展:题目原题链接:选址问题在一条数轴上有 N 家商店,它们的坐标分别为 A1~AN。现在需要在数轴上建立一家货仓,每天清晨,从货仓到每家商店都要运送一车商品。为了提高效率,求把货仓建在何处,可以使得货仓到每家商店的距离之和最小。输入格式第一行输入整数N。第二行N个整数A1~AN。输出格式输出一个整数,表示距离之和的最小值。数据范围1≤N≤100000,0≤Ai≤40000输入样例46 2 9 1输出样例12笔记这道题原创 2021-01-09 21:37:16 · 1444 阅读 · 3 评论 -
归并排序模板
归并排序模板为面试准备背下来就行#define _CRT_SECURE_NO_WARNINGS#include<iostream>using namespace std;const int N = 1000010;int num[N],tmp[N];void GB_sort(int num[], int l, int r) { if (l >= r)return; int mid = l + r >> 1; GB_sort(num原创 2020-10-13 22:28:58 · 125 阅读 · 0 评论 -
快速排序模板
快速排序快速排序模板O(nlogn)#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<stdio.h>using namespace std;const int N = 100000;int num[N];int main() { int x; scanf("%d", &x); for (int i = 0; i < x; i++)原创 2020-10-13 20:37:46 · 148 阅读 · 0 评论