随笔分类 - 算法学习笔记
努力小浣,不怕算法!!!
学成魔法,打败天下!!!
摘要:珂朵莉树的适用范围是具有区间赋值操作且数据随机的题目。 珂朵莉树的思想在于随机数据下的区间赋值操作很可能让大量元素变为同一个数,所以我们以三元组<l,r,v>的形式保存数据(区间[l,r]中的元素的值都是v): struct node { ll l, r; mutable ll v; // 这里mu
阅读全文
摘要:单调栈 定义 单调栈即满足单调性的栈结构。与单调队列相比,其只在一端进行进出。 使用方法:就是从栈顶读出来一个元素,该元素满足单调性的某一端。例如取出栈中的最小值。 原理 将一个元素插入单调栈时,为了维护栈的单调性,需要在保证将该元素插入到栈顶后整个栈满足单调性的前提下弹出最少的元素。 例如,栈中自
阅读全文
摘要:线段树引入遇到过好多次线段树的题目,要么就是用其他的方法去解决,要么就是不会写!!今天痛定思痛,决定好好归纳整理一下线段树 线段树解决的是「区间和」的问题,且该「区间」会被修改 什么意思呢?举个简单的例子,对于 nums = [1, 2, 3, 4, 5] 如果我们需要多次求某些区间的和,是不是首先
阅读全文
摘要://快速幂的实现部分,相当于ans=pow(base,exponent) while(exponent){ if(exponent&1) ans=ans*base; base=base*base;//基底 exponent>>=1;//指数 } 例题: 问题描述 将一个数N分为多个正整数之和,即N=
阅读全文
摘要:/* 滑动窗口算法框架 */ void slidingWindow(string s, string t) { unordered_map<char, int> need, window; for (char c : t) need[c]++; int left = 0, right = 0; in
阅读全文
摘要:二级搜索升天词 作者:labuladong 二分搜索不好记,左右边界让人迷 小于等于变小于, mid加一又减一 就算这样还没完,return应否再减一 信息慢慢刷力扣,AC比率二十一 我本将心向明月,奈何明月照沟渠 问君能有几多愁,恰似深情喂了狗 labuladong从天降,一同手撕算法题 赠军一法
阅读全文
摘要:【参考:https://blog.csdn.net/yjpeng125/article/details/120833365】 基本概念滑动窗口是一种基于双指针的一种思想,两个指针指向的元素之间形成一个窗口。 分类:窗口有两类,一种是固定大小类的窗口,一类是大小动态变化的窗口。 应用: 利用滑动窗口获
阅读全文
摘要:void dfs()//参数用来表示状态 { if(到达终点状态) { ...//根据题意添加 return; } if(越界或者是不合法状态) return; if(特殊状态)//剪枝 return ; for(扩展方式) { if(扩展方式所达到状态合法) { 修改操作;//根据题意来添加 标记
阅读全文
摘要:八皇后问题(英文:Eight queens),是由国际象棋棋手马克斯·贝瑟尔于1848年提出的问题,是回溯算法的典型案例。 1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。如果经过±90度、±180度旋转,和对角线对称变换的摆法看成一类,共有42类。
阅读全文
摘要:1.使用BFS的两个主要方案:遍历 或 找出最短路径 2. BFS的伪代码: 【模板一】 /** * Return the length of the shortest path between root and target node. */ int BFS(Node root, Node tar
阅读全文
摘要:假设原数组序列为abcd1234,要求变换成的数组序列为1234abcd,即循环右移了4位。比较发现,其中两段的顺序是不变的,1234和abcd,可以把这两段看成两个整体。右移k位的过程就是把数组两部分交换一下,交换过程可以通过三次反转实现: 1.反转前k部分:abcd1234->dcba1234;
阅读全文
摘要:1.利用set #include <iostream> #include <vector> #include <set> using namespace std; int main() { int myints[] = {1,2,3,1,1}; int len = sizeof(myints)/si
阅读全文
摘要:一、插入:先将一列插入到一维vector中,再插入到二维vector的一行中。 int N, M, a; cin >> N >> M; vector<vector<int >> V; vector<int > tmp; for (int i = 0; i < N; ++i) { tmp.clear(
阅读全文
摘要:一、set容器特性:和 map、multimap 容器不同,使用 set 容器存储的各个键值对,要求键 key 和值 value 必须相等。举个例子,如下有 2 组键值对数据:{<'a', 1>, <'b', 2>, <'c', 3>}、{<'a', 'a'>, <'b', 'b'>, <'c',
阅读全文
摘要:一、特性:map 容器中存储的数据是有序的,而 unordered_map 容器中是无序的。 可以将 unordered_map 容器等价为无序的 map 容器。 具体来讲,unordered_map 容器和 map 容器一样,以键值对(pair类型)的形式存储数据,存储的各个键值对的键互不相同且不
阅读全文
摘要:一、特性: multimap 容器保存的是有序的键/值对,但它可以保存重复的元素。multimap 中会出现具有相同键的元素序列,它们会被添加到容器中。除了这个特性,multimap大部分成员函数的使用方式和map相同。 二、使用情况:如果使用 multimap 容器,几乎可以肯定它会包含键重复的元
阅读全文
摘要:一、存储:map是一种关联式容器,map容器存储的都是pair对象,也就是用pair类模板创建的键值对。各个键值对的键和值可以是任意数据类型,包括c++基本数据类型(int、double等),使用结构体或类自定义的类型。通常情况下,map容器中存储的各个键值对都用string字符串作为键的类型。 二
阅读全文
摘要:lesson 1 什么是散列表(哈希表)? 一、散列思想:假设你们班级100个同学每个人的学号是由院系-年级-班级和编号组成,例如学号为01100168表示是1系,10级1班的68号。为了快速查找到68号的成绩信息,可以建立一张表,但是不能用学号作为下标,学号的数值实在太大。因此将学号除以11001
阅读全文
摘要:1. 高效去重 有序数组/链表 我们知道对于数组来说,在尾部插入、删除元素是比较高效的,时间复杂度是 O(1),但是如果在中间或者开头插入、删除元素,就会涉及数据的搬移,时间复杂度为 O(N),效率较低。 所以对于一般处理数组的算法问题,我们要尽可能只对数组尾部的元素进行操作,以避免额外的时间复杂度
阅读全文
摘要:1. 二分查找的代码 一、寻找一个数(基本的二分搜索) 这个场景是最简单的,可能也是大家最熟悉的,即搜索一个数,如果存在,返回其索引,否则返回 -1。 int binarySearch(int[] nums, int target) { int left = 0; int right = nums.
阅读全文