算法
文章平均质量分 61
Albert2X
分享知识,记录生活
展开
-
leetcode 402 321 316
402 移掉k个数字结合官方题解看下面的思路算法的核心原理是贪心算法,可以思考一下当执行到删k-1步得到最小时值时,如何采取下一步策略能够得到删k的最优解,并利用替换的思想作证明**具体为:**假设一个最优解删除的元素位置为p1,p2,..,pk−1,pkp_1,p_2,..,p_{k-1},p_kp1,p2,..,pk−1,pk, 设删掉p1,p2,..,pk−1p_1,p_2,..,p_{k-1}p1,p2,..,pk−1位置后的序列为x,则下一步a.删除x中不符合升序的第一个元原创 2021-04-23 00:48:05 · 145 阅读 · 0 评论 -
数据结构之单调栈
c++模板stack<int> st;for(int i = 0; i < nums.size(); i++){ while(!st.empty() && st.top() >= nums[i]) { st.pop(); } st.push(nums[i]);}原创 2021-04-19 23:53:07 · 296 阅读 · 0 评论 -
括号位置搜寻与字符串反转
问题:给定字符串,按照括号的优先级对字符串进行反转,输出最后不带括号版本的序列比如:输入:(ab(love)cd)输出:dcloveba解释:先反转love得到:(abevolcd)继续反转得:dcloveba#include<bits/stdc++.h>using namespace std;//v1笨。。void helper(string& input, int l, int r) { int left,count = 0; //在区原创 2021-04-17 18:47:26 · 359 阅读 · 0 评论 -
背包问题的抽象形式
0-1背包抽象 :有N个事物,每个事物n有价值量v和消耗c(c可以是多维的,比如卡车载物,一件物品既消耗体积又消耗载重),在不能重复选择的前提下(即事物最多被选择一次),问如何选择事物能使最后的价值量总和最大。状态转移方程为:其中,dp[i][c1..cn]dp[i][c_1..c_n]dp[i][c1..cn] 表示包含i件事物的,在消耗限制条件为c1..cnc_1..c_nc1..cn下的最优解,c1−..cn−c_1^-..c_n^-c1−..cn−表示将第i件事物考虑在内后,余原创 2021-03-21 21:25:42 · 135 阅读 · 0 评论 -
证明: 若$q=m$ 或 $q \neq m$ 但$P[q+1] \neq a$ ,则$\sigma(P_qa) = \sigma(P_{\pi[q]}a)$
证明: 若q=mq=mq=m 或 q≠mq \neq mq=m 但P[q+1]≠aP[q+1] \neq aP[q+1]=a ,则σ(Pqa)=σ(Pπ[q]a)\sigma(P_qa) = \sigma(P_{\pi[q]}a)σ(Pqa)=σ(Pπ[q]a)对于σ(Pqa)\sigma(P_qa)σ(Pqa),可以将它转化为如下问题:设A={k∣k<q , Pk⊐Pq}A=\{ k \mid k<q \, , \, P_k \sqsupset P_q\}A={k∣k&原创 2021-03-17 23:09:20 · 133 阅读 · 0 评论 -
DFS&BFS范式
DFS伪代码顶点入栈对顶点作入栈标记防止其二次入栈while 栈非空 访问栈顶p pop 栈顶p for q 为 p 的邻接结点 q 入栈 对q作入栈标记防止其二次入栈广度优先与深度优先在实现上十分类似,只需要把栈换成队列即可DFS伪代码顶点入队对顶点作入队标记防止其二次入队while 队非空 访问队头p pop 队头p for q 为 p 的邻接结点 q 入队 对q作入队标记防止其二次入队...原创 2021-03-11 11:16:50 · 203 阅读 · 0 评论 -
c++二分查找模板
一、查找已排数组A中 大于等于(或者大于) 给定target的 第一个 元素//当eq_enable为false时 对应【大于】的情况//当eq_enable为true时 对应【大于等于】的情况int binarySearch_GE_or_G(vector<int>& A, int target, bool eq_enable) { int left = 0, right = (int)A.size() - 1, ans = (int)A.size();原创 2021-03-02 23:20:35 · 205 阅读 · 0 评论 -
Floyd判圈法
在开始正式算法之前,先看看几个示例作铺垫。示例一:给定一个环,当两个箭头同时逆时针加1时,它们的相对距离不会发生变化(在这个例子中,即维持4个点的相对距离)。给定同样的环,若在每次更新时,蓝色箭头逆时针加2,而红色箭头逆时针加1,那么它们的相对距离就会在本次更新结束后缩短1,因此可以推导出,经过若干次更新后,红蓝箭头将会重合在同一个位置(即它们的相对距离为0)示例二:给定一个没有环的单向链表,如果每次更新时,蓝色箭头向右加2而红色箭头向右加1,则在任意一个时刻都有:蓝色箭头走过的总步长为红原创 2021-02-28 17:29:19 · 570 阅读 · 2 评论 -
KMP字符串匹配算法笔记
定义偏移(shift)为:匹配的的字符串位置前存在的字符数给定一个模式PPP,定义:σ(x)=argmaxk{k∣Pk⊐x}\sigma(x)=arg\max_{k} \{k \mid P_k \sqsupset x \}σ(x)=argkmax{k∣Pk⊐x}π[q]=argmaxk{k∣k<q,Pk⊐Pq}\pi[q]=arg\max_{k} \{k \mid k<q, P_k \sqsupset P_{q}\}π[q]=argkmax{k∣k<原创 2021-02-21 16:04:03 · 59 阅读 · 0 评论 -
二叉搜索树(Binary Search Trees)《算法导论》笔记
文章目录12.1 什么是二叉搜索树12.2 查询二叉搜索树查找最大关键字元素和最小关键字元素后继与前驱12.1 什么是二叉搜索树二叉搜索树是以一颗二叉树为原型加上某些约束而创建的一颗树,如下图所示:每个节点除了key和卫星数据外,还包含属性left、right、p,它们分别指向左子结点、右子结点、父结点。如果某个结点的子结点或者父结点不存在,则将相应的属性的值设为NIL。根结点(从上往下数第一个结点)是树中唯一的父指针为NIL的结点。二叉搜索树中的key值必须满足以下约束:设x是二叉搜索树中的某个原创 2020-08-26 23:31:00 · 853 阅读 · 0 评论 -
0-1背包问题(0-1 knapsack problem)c++实现
问题描述有n个物品,它们有各自的重量和价值,现有给定最大载重的背包,如何让背包里装入的物品具有最大的价值总和?比如:基本原理定义数组A[0…n][0…maxWeight]其中,n表示商品的总数,maxWeight表示背包的最大载重量。用A[i][w]的含义为包含前i件商品且最大载重为w时的子问题的最优方案的总价值。只需要讨论当前商品i是否可能在当前子问题的最优方案中便可以得到以下递推式:若 weigth[i] > w, 即当前商品i太重了,故不可能出现在当前子问题的最优方案里,因此原创 2020-08-30 22:54:52 · 737 阅读 · 0 评论