![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
文章平均质量分 56
_不动明王
自从厌倦于追寻,我已学会一觅即中。自从一股逆风袭来,我已能抵抗八面来风,驾舟而行。
展开
-
C++如何制作一个Split()函数(使用STL进行组合的坑)
一.使用STL进行组合find函数原型:size_t find(const string& str, size_t pos = 0) const;功能:查找子字符串第一次出现的位置。参数说明:str为子字符串,pos为初始查找位置。返回值:找到的话返回第一次出现的位置,否则返回string::npossubstr函数原型:string substr(size_t pos = 0, size_t n = npos) const;功能:获得子字符串。参数说明:pos为起始位置(默认为0原创 2022-01-06 12:48:16 · 598 阅读 · 0 评论 -
希尔排序分析与理解
一.算法思想基本思想:将数据分成若干个序列,然后对每个序列分别进行直接插入排序,每个序列由两两相邻x位置组成,该x称为每次切割的增量。接着减少增量x,再对每个序列进行直接插入排序,当增量x足够小时,则说明此时序列基本有序,此时再对整个序列进行最后一次插入排序,由于此时序列基本有序,所以插入排序的效率是非常高的。所以希尔排序在时间效率上比直接插入排序有较大提高。...原创 2021-11-05 14:59:05 · 915 阅读 · 0 评论 -
两球之间的磁力
1552. 两球之间的磁力分析可知:原创 2021-09-24 11:08:31 · 228 阅读 · 0 评论 -
整数拆分-动态规划
解法:动态规划一.确定状态根据题目使拆分整数乘积最大,我们可以设dp[i]表示整数i的拆分的最大乘积。二.转移方程根据题目描述,一个整数最少要拆分为两个整数,我们可以表示为:j和i-j(0<j<i),而dp[i]应取j*d[i-j]或j*(i-j)这两者的最大值。有些人可能会问为什么j不用拆分,这是因为遍历j已经实现了j的拆分。三.初始化边界只需使dp[1]=1。int integerBreak(int n){ vector< int > dp(n+1).原创 2021-09-03 10:55:22 · 298 阅读 · 0 评论 -
最长回文子串
解法:动态规划。一:确定状态根据问题寻找 s 中最长的回文子串。我们假设字符串x为回文串,那么我们在x前后各增加同一个字符,得到的新串肯定为一个回文串。由此可知(1)最后一步为:在x前后各增加同一个字符,得到最长的回文子串。(2)子问题:用长为L得回文串str,在其前后各增加同一个字符,得到长为L+2得新回文串二:转移方程我们用P(i,j) 表示字符串 s 的第 i 到 j个字母组成的串(下文表示成 s[i:j]s[i:j])是否为回文串P(i,j)=P(i+1,j)...原创 2021-09-02 18:48:04 · 55 阅读 · 0 评论 -
C++的STL(持续更新)
C++的STL(持续更新)一. upper_bound()函数和 lower_bound()一. upper_bound()函数和 lower_bound()1. upper_bound()功能:1.//查找[first, last)区域中第一个大于 val 的元素。ForwardIterator upper_bound (ForwardIterator first, ForwardIterator last,const T& val);详细解释:其中first和last表示的是区间地原创 2021-09-02 11:08:09 · 118 阅读 · 0 评论 -
Leetcode- 使字符串平衡的最小交换次数
这是一个括号匹配问题。通过分析可知对于一个平衡字符串,从左往右遍历它,统计未匹配的左括号的个数 num,遇到左括号就加1,遇到右括号就减1,如果遍历时遇到右括号之后发现num为负数,那么就需要在后面找一个左括号并与这个右括号交换,然后使num+2.如果任何时刻 num 都不为负数,那么这个字符串就是平衡的。当然本题中给的数据最终都可以达到平衡状态。通过分析,我们可以发现为了使后续的交换次数最小,这个被交换走的右括号应当越靠右越好,所以我们可以拿字符串最右边的左括号来交换。当然在实际求解这道题使可以不..原创 2021-08-08 18:29:20 · 422 阅读 · 0 评论 -
BFS之迷宫的最短路径
BFS之迷宫的最短路径整体思想:简单来说就是步步为营,在现实生活中我们走迷宫无非两种方法,一种是拿一条线,不管三七二十一一路走下去,如果碰到障碍就返回,然后换一个方向走下去。另一种就是你每走一步 ,就观察你周围的情况,并把它记录下来,然后你走下一步的时候,就把你刚才记录的可以走的地方都试着走一遍,并记录周围的情况,以及标记我是从哪里走到这个位置的。重复以上步骤,最后按照这种方式你也可以找到出口,由于你每走到一个地方都会标记我是从哪里走到这个位置的,所以你可以 根据这个反推路径。从编程的角度来看:找到从原创 2021-07-01 10:55:17 · 544 阅读 · 0 评论 -
做题模板小结
深度搜索#include <iostream>#include <vector>using namespace std;int n=3,m=3;//收缩地域的大小(一般题目)会给出vector< vector<char> > map(n,vector<char>(m));//搜索的地方vector< vector<bool> > visi(n,vector<bool>(m));//搜索的标记int原创 2021-03-30 20:42:03 · 92 阅读 · 0 评论 -
二叉排序树
1.二叉排序树定义(1)若左子树不空,则左子树上所有结点的值均小于或等于它的根结点的值;(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;(3)左、右子树也分别为二叉排序树;例如这样一组数据3, 5, 1, 7, 2。它的有它构成的排序树为:2.二叉排序树操作(举例为左小右大)(1)插入:根据二叉树的性质,使用指针和循环或者使用递归寻找到相应位置插入节点。(2)删除:对于二叉排序树的每个结点,它的左子树上的元素都小于该结点上的元素 ,右子树上的元素都大于该结点上的元素,根据这个原创 2021-02-01 17:43:32 · 1508 阅读 · 0 评论 -
快速排序
快速排序算法的基本内容:选择一个基准数,然后结合分治法,把数据分为两个部分,如果你想要数据升序排列,那么基准数左边就需要比基准数小,基准数右边就需要比基准数大,如果是降序排列则相反。接下来基准数左右两边数据继续使用快速排序进行排序(一般使用递归),当左边数据或右边数据只剩一个元素时,则说明元素排序完成。下面我们结合具体数据来说明一下。将下面这组数据由小到大进行排列.1.首先我们先选择一个基准数(base)通常是数据的第一位,也就是4,下标(baseindex)为0;2.然后开始比较,规则如下:(原创 2021-01-30 16:04:45 · 151 阅读 · 0 评论 -
栈和队列,及其低层实现
一.栈1)栈的概念:栈是操作限定在表的尾端进行的线性表。表尾由于要进行插入、删除等操作,所以,它具有特殊的含义,把表尾称为栈顶,另一端是固定的,叫栈底。当栈中没有数据元素时叫作空栈。2)栈的特点:先进后出3)栈的好处:单纯从功能上讲,数组或者链表可以替代栈。它们的操作过于灵活,,当数据量很大的时候就会出现一些隐藏的风险。虽然栈限定降低了操作的灵活性,但这也使得栈在处理只涉及一端新增和删除数据的问题时效率更高,更不容易出错。1. 顺序栈(1)顺序栈的概念:用一片连续的存储空间来存储栈中的数据元素(使原创 2021-01-28 16:59:41 · 371 阅读 · 0 评论 -
线性表(顺序表,链表等)及其实现(C#版)
线性表线性表的实现方式有下面几种1.顺序表线性表的顺序存储是指在内存中用一块地址连续的空间依次存放线性表的数据元素,用这种方式存储的线性表叫顺序表,它的实现主要依赖于数组。顺序表的实现:using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace _线性表{ //IComparable<T&g原创 2021-01-25 16:52:15 · 378 阅读 · 0 评论