Algorithm
算法
郑师傅炒板栗
老师不是说你啊
展开
-
1438. 绝对差不超过限制的最长连续子数组
1438. 绝对差不超过限制的最长连续子数组滑动窗口算法双指针multiset容器基于红黑树原创 2023-01-29 17:03:42 · 301 阅读 · 2 评论 -
力扣 1004. 最大连续1的个数 III
力扣 1004. 最大连续1的个数 III滑动窗口算法详细思路解析双指针数组原创 2023-01-29 15:26:03 · 203 阅读 · 0 评论 -
力扣 3. 无重复字符的最长子串
力扣 3. 无重复字符的最长子串, 滑动窗口算法, 双指针原创 2023-01-29 14:29:44 · 232 阅读 · 0 评论 -
力扣 438. 找到字符串中所有字母异位词
力扣 438. 找到字符串中所有字母异位词, 滑动窗口算法, 详细代码注释, 以及解题的思路原创 2023-01-29 12:12:49 · 122 阅读 · 0 评论 -
力扣 567. 字符串的排列
力扣 567. 字符串的排列, 滑动窗口算法, 包含详细思路解析原创 2023-01-29 11:44:34 · 101 阅读 · 0 评论 -
力扣 76. 最小覆盖子串
滑动窗口算法, 力扣76 最小覆盖子串原创 2023-01-29 10:42:27 · 345 阅读 · 0 评论 -
dia和威严(dfs)
(1)代码 + 思路(注释)// 边 权值 树 DFS// 边权,点权 // 因为只会往下,所以不开标记数组(不会回溯) #include <bits/stdc++.h>using namespace std;const int N = 200010;#define ll long long vector<pair<int, int>> resu[N]; // 存储上级x到下级y传递信息的时间kint n; // 学生会的总人数,包括会长dia(ro.原创 2022-04-12 18:49:51 · 454 阅读 · 0 评论 -
常用的递归算法:dfs(深度优先搜索),记忆化搜索,分治
递归值函数调用自身;一、DFS的介绍概念很简单,但是还是得了解一下,下面介绍的内容是重点1. 图的DFS(1)先看一下vector是怎么建图的?vector<int> vecMap[100010];// n条边(这个结点所连接的结点) 邻接表建图for (int i = 0; i < n; ++i) { int x, y; vecMap[x].push_back(y); vecMap[y].push_back(x); //若是无向图就加上这一句}(2.原创 2022-04-12 14:54:52 · 1429 阅读 · 0 评论 -
ranko的手表(枚举)
(1)思路:枚举所有t1,t2可能的分钟数(转换成分钟好算),再遍历这些枚举的可能结果,不断维护更新最大时间间距和最小时间间距,主要就是这个过程该如何枚举:见代码有注释(时有十位和个位,分有十位和个位)(2)测试数据18:0?2?:1?(3)代码:// 贪心可以,但是考虑的情况很多且复杂 // 24 *60 枚举可以过// 将时分统一转换为分钟,到时候好算// 枚举t1和t2可能的分钟数,合理的先加入到vector容器中 #include <bits/stdc++.h&.原创 2022-04-10 17:05:14 · 1022 阅读 · 0 评论 -
数位染色(状压枚举/dfs)
(1)思路:x的范围不超过1e18,所以x最多只有19位数字。O(n2^n)状压枚举每位选或不选即可通过。(每个位置上两种状态0或1,多少位置,2的多少次方)还需要遍历n;代码中有注释,可以先看一遍代码,方便理解(2)测试数据1234567(3)代码(状压—状态压缩)// 状压基本模板 #include <bits/stdc++.h>using namespace std;#define ll long long int zt[22]; //代表每一位上的数字,等下..原创 2022-04-10 15:33:48 · 706 阅读 · 0 评论 -
you和帆船(枚举)
(1)测试数据21 00 1(2)代码(思路在注释中)// 直接枚举 //2 ≤n ≤2000 可以枚举 #include <bits/stdc++.h>using namespace std;int n;const int N = 2005;int a[N][2]; double minDis = 1e9; //最小路径和 int main () { double tmp; cin >> n; // 输入宝藏的地点 for (int i =.原创 2022-04-10 14:31:36 · 195 阅读 · 0 评论 -
chika和蜜柑(贪心/优先队列)
chika和蜜柑(1)思路:贪心按照甜度最大的来取(从大到小排序),遇到相同甜度的去酸度最小(从小到大排序),可以用sort也可以用优先队列来写;(2)测试数据3 21 3 42 2 5(3)代码(贪心思想 + sort)#include <bits/stdc++.h>using namespace std;#define ll long longint n;// 在C++的语法里面,可以直接用 结构体名字来定义变量,而无需用typedef重命名 struct原创 2022-04-09 21:55:04 · 520 阅读 · 0 评论 -
疯狂的自我检索者(贪心)
疯狂的自我检索者(1)关键思路贪心的思想:未知的人都打5分,就是最大的了,未知的人都打1分,就是最小的了;(2)测试数据5 11 2 3 4(3)代码// 贪心 #include <bits/stdc++.h>using namespace std;#define ll long long ll n, m;double avMax;double avMin;int main () { ll x; cin >> n >> m;原创 2022-04-09 20:48:01 · 419 阅读 · 0 评论 -
贪心算法的介绍+枚举算法的介绍(brute force):包含练手题目
一、什么是贪心算法贪心值每一步都做出当前最优的选择。一般解决的问题有如下特点:局部最优能导致全局最优。1. 举个例子:问题如下:纸币面额有1元、2元、10元、100元。问凑出正好x元最少要多少张纸币?关键思路:我们就可以用贪心,每一次都尽量取面额大的,不断凑出x;为什么这样贪心不会有问题?因为 1 2 10 100, 这些数字之间,他们有整除关系,这意味着,多张小面额的纸币,一定可以被面额大的数字所代替;如果现在的纸币面额为1 15 17 21,那么还可以用贪心吗?思考一下;现在已原创 2022-04-09 19:56:57 · 535 阅读 · 0 评论 -
kotori和n皇后
kotori和n皇后(1)测试数据51 22 53 16 74 8224(2)关键思路开4个set,分别存x、y、x + y、x - y;遍历时,不断查询每个点是否在某个set里面存在,若不存在则分别加入4个set。否则证明和之前的皇后会攻击(把这个i皇后保留下来);现在来说一下,为什么要保留这四个;x, or y集合中如果有已经相等的,说明是在同一行或者同一列(同行和同列会互相攻击);x - y存进集合中如果有已经相等的,说明在同45斜角(x1 - y1 == x2原创 2022-04-08 22:38:45 · 365 阅读 · 0 评论 -
算术教室(两种方法,一种set,一种利用二分)
算术教室关键思路:方法一:将a数组排好序后,然后遍历b数组,利用二分查找的方法(logn),在a数组中查找x-b[i];(这个方法先略过,以后有时间补上,这里主要是熟悉STL操作);方法二:利用set集合,将a数组输入到set集合中,然后在集合中查找x - b[i](1)测试数据5 4 121 3 4 5 93 4 6 10(2)代码(set)#include <bits/stdc++.h>using namespace std;#define ll long l原创 2022-04-08 20:56:42 · 514 阅读 · 0 评论 -
计划清单(模拟)
思路:双端队列+结构体模拟#include <bits/stdc++.h>using namespace std;struct Task { string name; long long lel;};deque<Task> dq;// 双端队列long long n;int main() { cin >> n; for (int i = 0; i < n; ++i) { Task tmp; cin >> tmp....原创 2022-04-08 19:16:03 · 155 阅读 · 0 评论 -
小红练心算
思路:把握三个数字,构造一个函数,返回值是下一个平方的数字(m),然后更新a(k:全局变量)与a+2*x(t:全局变量,!!!但是但是,为了最后的输出方便,t就接收较大的值,也就是说t可等于更新后的a,例如:48 ,k = 46,,t = 50,看代码吧,这里说的不好),这里我们用括号里面的数字简略代替,什么意思呢?我们用939来举例经过一次函数调用之后,k = 900,t = 978,m = 39(待平方的数字);所有的乘积小的数一定写在大的数前面这题用long long,数据挺大的;可以算...原创 2022-04-08 17:03:09 · 158 阅读 · 0 评论 -
小红和R (模拟)
思路:找规律第一行,输出n+2个R;接下来n行,先输出一个R,然后输出n个空格,接着再输出一个R来结尾;接下来,输出n+2个R;接下来的n+1行,每行都是输出两个R,注意,两个R之间有空格,空格的个数从0开始递增,知道最后一行有时候这样的题,单个看,不好看,就得一块一块的分区看,来找规律;#include <bits/stdc++.h>using namespace std;int n;int main() { cin >> n; for (int i ...原创 2022-04-08 14:09:22 · 112 阅读 · 0 评论 -
小红填符号
小红填符号思路:模拟(16个if),这是暴力的方法#include <bits/stdc++.h>using namespace std;double a, b, c, x; // !!!// 注意要特判除0的情况 int main (){ cin >> a >> b >> c >> x; if (a + b + c == x) cout << "+ +" << endl; else if (原创 2022-04-08 13:49:38 · 108 阅读 · 0 评论 -
小红划数字
小红划数字关键思路:这个数的个位数字是偶数,那它就是偶数;所以我们可以优先划掉后面的数字,直到遇到偶数为止;不要想的太复杂了;#include <bits/stdc++.h>using namespace std;string nums;int main() { cin >> nums; bool flag = false; int lenN = nums.size(); int ans = 0; for (int i = lenN - 1; i原创 2022-04-07 21:57:08 · 187 阅读 · 0 评论 -
CPP21 C++冒泡排序 牛客
冒泡排序的思想:关键就是“冒泡”,例如:从小到大排序,那意味着,我要将“大的泡泡”往上面浮,那么怎么浮呢?示意图如下:#include <iostream>using namespace std;int main() { int arr[6] = { 0 }; int len = sizeof(arr) / sizeof(int); // 待排序数组的长度 for (int i = 0; i < len; i++) {原创 2022-04-01 13:58:58 · 1062 阅读 · 0 评论 -
NC257 求1+2+3+...+n 牛客题霸
等差数列求和公式class Solution {public: int Sum_Solution(int n) { // 等差数列公式 return (1 + n) * (n - 1 + 1) / 2; }};原创 2022-03-28 10:18:20 · 157 阅读 · 0 评论 -
NC101 压缩字符串(一) 牛客题霸
双指针模拟class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param param string字符串 * @return string字符串 */ string compressString(string param) { // write code here // 双指针 i原创 2022-03-27 21:32:22 · 430 阅读 · 0 评论 -
NC38 螺旋矩阵 牛客题霸
模拟题,注意越界啊!class Solution { public: vector<int> spiralOrder(vector<vector<int> >& matrix) { // 简单模拟 int m = matrix.size(); // 行 vector<int> C; if (m == 0) return C; .原创 2022-03-27 20:06:40 · 425 阅读 · 0 评论 -
NC1 大数加法 牛客题霸
关于高精度大数的计算,我之前写过一篇笔记(ACWING 大神的思想模板),可以参考一下高精度class Solution {public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 计算两个数之和 * @param s string字符串 表示第一个整数 * @param t string字符串 表示第二个整数 * @return string字符串 */ string so..原创 2022-03-27 16:25:36 · 1724 阅读 · 0 评论 -
NC151 最大公约数 牛客题霸(辗转相除法)
class Solution {public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * 求出a、b的最大公约数。 * @param a int * @param b int * @return int */ int gcd(int a, int b) { // write code here return b == 0 ? a :.原创 2022-03-27 15:40:33 · 151 阅读 · 0 评论 -
NC105 二分查找-II 牛客题霸
二分的思想,我之前写过一篇博客,可以参照一下基础算法class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * 如果目标值存在返回下标,否则返回 -1 * @param nums int整型vector * @param target int整型 * @return int整型 */ int search(vector<i..原创 2022-03-26 22:47:13 · 264 阅读 · 0 评论 -
NC65 斐波那契数列 牛客题霸
一、 NC 65在递归的过程中,越往下走,重复计算的数就越多;记忆化搜索算法class Solution { public: int Fibonacci(int n) { // 用递归很慢,这里我们可以考虑把中间的值存下来,不用重复计算,dp数组 int dp[105]; dp[1] = 1; // 初始化斐波那契数列,这里我让下标从1开始,比较好算 dp[2] = 1; if (n < 3) {原创 2022-03-26 21:25:18 · 501 阅读 · 0 评论 -
NC4 判断链表中是否有环牛客题霸
关键思路:创造两个指针,一个走的快(一次走两个结点),一个走的慢(一次走一个结点),若是存在环的话,两个快慢指针一定会相遇(因为在环中,两个快慢指针的距离会每次缩小1,直到相遇,画个图模拟一下);若无环,就会走到NULL;/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(N..原创 2022-03-26 20:19:00 · 1893 阅读 · 0 评论 -
NC22 合并两个有序的数组牛客题霸
有序数组的合并,我们很容易想的到双指针思想(这个跟归并排序二分后再合并数组这一步一样),但是这里要注意一下,我们还是要把数据存回A数组中,而不断的移动数字插入是很浪费效率的,题目中又说A数组有足够的空间存放B数组,且A数组的空间大小为m + n,也就是说,我们可以想到:如下画图演示;class Solution {public: void merge(int A[], int m, int B[], int n) { int lenOldA = m - 1; // 原先A..原创 2022-03-26 16:01:26 · 417 阅读 · 0 评论 -
NC34 不同路径的数目(一) 牛客题霸
关键思路:class Solution {public: /** * * @param m int整型 * @param n int整型 * @return int整型 */ int uniquePaths(int m, int n) { // write code here int dp[115][115]; // 定义dp数组 // 初始化第一行和第一列..原创 2022-03-26 15:27:47 · 375 阅读 · 0 评论 -
NC141 判断是否为回文字符串 牛客题霸
NC 103 反转字符串 的其中一个思路有点像回文串就是正读和反读都一样的字符串;所以也可以先反转字符串,再将前后两个字符串比较;class Solution {public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * @param str string字符串 待判断的字符串 * @return bool布尔型 */ bool judge(string str) { .原创 2022-03-25 22:21:42 · 247 阅读 · 0 评论 -
NC59 矩阵的最小路径和 牛客题霸
关键思路:dp思想,如图:先对第一行和第一列来更新,往后每一行的单元格,判断其上边和左边的单元格的大小,选择较小值,与当前单元格的值相加,即当前到这个单元格的最小路径和,直到终点;class Solution {public: /** * * @param matrix int整型vector<vector<>> the matrix * @return int整型 */ int minPathSum(vector..原创 2022-03-25 22:06:19 · 251 阅读 · 0 评论 -
NC 143 矩阵乘法牛客题霸
思路:就是模拟矩阵乘法的运算过程;class Solution {public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * @param a int整型vector<vector<>> 第一个矩阵 * @param b int整型vector<vector<>> 第二个矩阵 * @return int整型vector<vector&l..原创 2022-03-25 16:27:56 · 221 阅读 · 0 评论 -
牛客题霸 NC 103 反转字符串
解法一:利用额外空间,来反转(这里不提);解法二:原地反转:解法三:利用自带的库函数:reverse(begin(), end())class Solution { public: /** * 反转字符串 * @param str string字符串 * @return string字符串 */ string solve(string str) { // write code here// int l..原创 2022-03-25 14:18:22 · 131 阅读 · 0 评论 -
牛客题霸 NC7 买卖股票的最好时机(一)
思路:一般,我们最直观的可以想到暴力,两重循环,在i天的时候,(第二重for循环)遍历寻找前面i - 1天中的最小值(就是买入的时机),与第i天的价值相减就是收益,再比较收益,实时更新获取最大值;但是我们仔细想想在这个过程中,是不是做了很多重复的操作,就是在寻找最小值时,这一部分我们有些值重复比较了好多次;所以优化的方法是:实时更新最小值,将最小值记录下来,再去求每个i天的最大收益的比较,具体可以看代码class Solution {public: /** * * @..原创 2022-03-24 15:42:23 · 357 阅读 · 0 评论 -
第二章 数据结构(一):链表与邻接表,栈与队列,kmp
第二章 数据结构(一)包含内容:1.链表与邻接表;2.栈与队列;3.kmp;struct Node{ int val; // 值 Node *next; //指针};// 这种方式不讲// 因为这种方式,每一次创建一个新的链表的时候,就要new 新的结点new Node(); // 非常慢// 动态链表方式慢- 所以我们采用数组模拟链表的方式一、链表与邻接表1. 数组模拟单链表——应用多的是邻接表邻接表的常用用途是存储树和图(1)ACWING 826 单链表原创 2022-03-14 22:08:47 · 1177 阅读 · 0 评论 -
第一章 基础算法(三):双指针算法,位运算,离散化,区间合并
第一章 基础算法(三)一、双指针算法① 两个指针分别指向两个序列; :归并②两个指针分别指向同一个序列 :快排for (i = 0, j = 0; i < n; ++i){ while (j > i && check(i, j)) j++; // 具体逻辑}核心思想:可以将某些朴素(暴力)算法(O(n)^2),优化到O(n);(1)双指针思想:解决将一组字符串的的单词提炼问题【初步】#include <bits/stdc++.h&原创 2022-03-11 11:25:57 · 337 阅读 · 0 评论 -
第一章 基础算法(二)包含高精度以及前缀和差分
第一章 基础算法(二)一、高精度一般来说,高精度会考有四种:(都是大数)A + B : A, B位数10^6A - B : A, B位数10^6A * a : len(A) <= 10^6 a <= 10^9| a <= 10000(a 这里是指数值,不是位数)A / aA * | / B(1)问题一:大整数在代码中是如何表示的,如何存储?int 变量肯定存储不了大整数;我们是将大整数的每一位存储在数组里面;// 例如 123456789, 我们将它放到数组原创 2022-03-09 12:11:13 · 280 阅读 · 0 评论