算法与数据结构
王亿亿
做一个简简单单的大厂梦。
展开
-
求解最长公共前缀【STL<string>】
题目牛客网NC55STL用sort函数对容器内字符串进行排序,只要第一个和最后一个字符串某一位不一样,中间肯定有不一样。string longestCommonPrefix(vector<string>& strs) { int n=strs.size(); if(n==0) return ""; if(n==1) return strs[0]; sort(strs.begin(),strs.end());原创 2021-02-18 15:26:34 · 121 阅读 · 1 评论 -
括号匹配问题【栈】【STL<stack>】
参考《王道考研2021版数据结构》算法的思想如下:1))初始设置一个空栈,顺序读入括号。2)若是右括号,则或者使置于栈顶的最急迫期待得以消解,或者是不合法的情况(括号序列不匹配,退出程序)。3)若是左括号,则作为一个新的更急迫的期待压入栈中,自然使原有的在栈中的所有未消解的期待的急迫性降了一级。算法结束时,栈为空,否则括号序列不匹配。C语言考研代码我试了下这些函数不能再编译器code::blocks中直接用,我就不想再码一遍函数原型了。使用STL中C++的stack库函数实现涉及到.原创 2021-02-05 13:48:46 · 279 阅读 · 0 评论 -
【C++面向对象】处理数据
上次天梯赛做的巨差,蓝桥杯也只有一个国三,今年三月还有一场,复习下C++,还是准备准备。只记录我复习的时候觉得没掌握的内容。参考《C++ Primer Plus》这里上传一个虽然不太全面,但是比较好用的常用函数索引。就叫C++API。很多地方能搜到。链接:https://pan.baidu.com/s/1U3Q7MFNfVpV0taawmrWzIg 提取码:ldig复制这段内容后打开百度网盘手机App,操作更方便哦整数字面值标识符dec,hex,oct分别用于指示cout以十进制,十六原创 2021-01-15 14:06:07 · 80 阅读 · 0 评论 -
求解幂集问题【回溯法】
问题描述对于给定的正整数n,求1~n构成的集合的幂集。(即由1-n集合中所有子集构成的集合,包括全集和空集。例如 a[3]={1, 2, 3}.幂集为:{ }, {1}, {2}, {3}, {1 2}, {1 3}, {2 3}, {1 2 3}回溯法本问题的解空间为子集树,每个元素只有两种扩展,要么选择,要么不选择。采用深度有限搜索思路,解向量为x[],x[i]=0表示不选择a[i],x[i]=1表示选择a[i]。初始:i=0,x[]=0->目标:i=n,x为一个解。从状态(i,x)可扩原创 2020-10-16 12:25:25 · 2216 阅读 · 0 评论 -
求解完全背包问题【动态规划】
问题描述有n个重量和价值分别为wi,vi的物品,从这些物品中挑选出总重量不超过W的物品,求所有挑选方案中价值总和的最大值。每种物品可以挑选任意多件。动态规划设置二维动态规划数组dp,dp[i][j]表示从前i个物品中选出重量不超过j的物品的最总大价值。另外设置二维数组fk[i][j],其中fk[i][j]存放dp[i][j]得到最大值时物品i挑选的件数。对应状态方程:背包不能装入任何物品,总价值为0。dp[i][0]=0没有任何物品可以装入,总价值为0。dp[0][j]=0当kw[i]≤j时,原创 2020-10-15 16:27:55 · 699 阅读 · 0 评论 -
求解0/1背包问题【动态规划】
问题描述现有n件物品,每件都有对应的重量(w)和价值(v),有一个给定容量(C)的背包,怎么样才能在背包里装入具有最大价值总和的东西。例如,n=5,w={2,2,6,5,4},v={6,3,5,4,6}(下标从1开始),C=10。动态规划设置二维动态规划数组dp,dp[i][r]表示背包剩余容量为r,已考虑物品1…i时背包装入物品的最优价值。对应状态方程:背包不能装入任何物品,总价值为0。dp[i][0]=0没有任何物品可以装入,总价值为0。dp[0][r]=0r<w[i]剩余重量小于原创 2020-10-15 15:53:45 · 555 阅读 · 0 评论 -
求解最大子序列【动态规划】
问题描述字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干字符(可以不去)后所形成的字符序列。ac是abcd子序列。求两序列的最长公共子序列(LCS)。动态规划对于数组A[m],B[n]:边界dp=0Am-1=Bn-1,退一步,dp[m-1][n-1]=dp[m-2][n-2]Am-1≠Bn-1,分别退一步,dp[m-1][n-1]=max(dp[m-2][n-1],dp[m-1][n-2])# include<bits/stdc++.h>using names原创 2020-10-15 09:04:00 · 158 阅读 · 0 评论 -
求解整数拆分问题【动态规划】【备忘录】
问题描述求讲正整数n无需拆分成最大数为k的拆分方案个数【f(n,k)】,要求所有的拆分方案不重复。动态规划#include<bits/stdc++.h>using namespace std;#define MAXN 500int dp[MAXN][MAXN];//动态规划算法 void Split(int n, int k){ for(int i=1; i<=n; i++) for(int j=1; j<=k; j++) { if(i==1||j=原创 2020-10-14 08:51:27 · 1677 阅读 · 3 评论 -
求解带权有向图的最短路径【动态规划】
问题说明一个图G=(V,E)是多段图,是指顶点集V划分成k个互不相交的子集Vi,使得E中任意一条边(u,v)必有u,v属于两个不同的子集。A是源点,E是终点。1 动态规划1.1 动态规划逆序解法从后向前,E->A。next数组储存路径上一个顶点的后继节点。#include<bits/stdc++.h>using namespace std;#define MAX 21#define INF 0x3f3f3f3f //int型整数的无穷大//问题表示int n; //顶原创 2020-10-13 12:29:01 · 2610 阅读 · 0 评论 -
求解最大连续子序列和问题【分治法】【动态规划】
问题描述给定一个有n(n>=1)个整数的序列,求出其中最大连续子序列的和。例如序列(-2,,11,-4,13,-5,-2)的最大子序列和为20。规定一个序列的最大连续子序列和至少是0,如果小于0,其结果为0。分治法当n>1,取中间位置mid,将原序列一分为二->分别求出3中最大子序列和:完全在左序列,完全在右子序列,横跨两个序列(两个序列边界最大子序列和相加)->找出这3个子序列和中的最大值。#include<bits/stdc++.h>using namesp原创 2020-10-11 16:39:02 · 3725 阅读 · 0 评论 -
折半查找
折半查找折半查找也是二分查找,要求查找序列中的元素都是有序的,每次与当前查找区间的中点位置上的关键字比较确定查找是否成功,不成功则将当前区域缩小一半。重复这一过程,直到查找到关键字为k的元素。#include<iostream>using namespace std;//折半查找算法,k为需要查找的值 int BinSearch(int a[], int low, int high, int k){ int mid; //中间序列号 if(low<=high) { m原创 2020-10-11 15:21:45 · 1322 阅读 · 0 评论 -
归并排序
归并排序基本思想:将数组看到n个长度为1有序表,将相邻的k个有序子表成对归并,得到一个新的有序子表。反复操作,最后得到一个长度为n的有序表。k=2时,就是二路归并排序。分治法1 自底向上的二路归并策略:分解(原序列看成为n个长度为1的子序列)->求解子问题(相邻子序列合并)->合并(整个序列在数组a中,此处可以忽略)其中,“相邻子序列合并”时,先将原序列a[]中的两个子表,进行逐个比较,较小者放到一个临时表tmp[],得到一个临时有序表,再将其复制到原序列a中。...原创 2020-10-10 18:48:58 · 109 阅读 · 0 评论 -
快速排序
快速排序基本思想:在待排序的n个元素中,任取一个元素作为基准(通常是第一个元素),所有小于基准的在前子序列中,所有大于基准的在后子序列中,基准在其正确位置。然后对两个子序列分别重复上诉过程,知道每个子序列内只有一个元素或为空。分治法策略:分解(原序列分解为子序列)->求解子问题(子序列长度为0/1,直接返回;否则递归到各个子问题)->合并(整个序列在数组a中,此处可以忽略)...原创 2020-10-10 17:46:49 · 96 阅读 · 0 评论