精华内容
下载资源
问答
  • 算法

    万次阅读 2018-02-08 00:13:09
    1.算法定义 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出...

    1.算法定义

    算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。

    一个算法应该具有以下七个重要的特征:
    ①有穷性(Finiteness):算法的有穷性是指算法必须能在执行有限个步骤之后终止;
    ②确切性(Definiteness):算法的每一步骤必须有确切的定义;
    ③输入项(Input):一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输 入是指算法本身定出了初始条件;
    ④输出项(Output):一个算法有一个或多个输出,以反映对输入数据加工后的结果。没 有输出的算法是毫无意义的;
    ⑤可行性(Effectiveness):算法中执行的任何计算步骤都是可以被分解为基本的可执行 的操作步,即每个计算步都可以在有限时间内完成(也称之为有效性);
    ⑥高效性(High efficiency):执行速度快,占用资源少;
    ⑦健壮性(Robustness):对数据响应正确。

    2. 时间复杂度

    计算机科学中,算法的时间复杂度是

    展开全文
  • 算法工程师大致是什么的

    万次阅读 多人点赞 2021-01-25 22:37:39
    笔者在算法领域这些年遇到了不少做算法的同行,发现各自的差别还是很大的,工作侧重点甚至思维方式都不同。为了给刚入门的朋友介绍得清晰一些,这里就简单串一串我遇到的不同的算法算法与非算法的区别 一般来说,...

    作者: 龙心尘
    时间:2021年1月
    出处:https://blog.csdn.net/longxinchen_ml/article/details/113074403

    其实这是一个不太好解释的问题,因为并没有一个完备的定义。笔者在算法领域遇到了不少同行,发现各自的工作侧重点甚至思维方式都很不同。为了给入门的朋友一个清晰的梳理,这里就简单串一串12个常见的算法。
    首先,全景图镇楼。
    在这里插入图片描述

    算法与非算法的区别

    一般来说,可以把编程工作分为两种,一种是面向实现的,一种是面向优化的。前者如实现一个功能、搭建一个服务、实现一种展现交互方式等。更关注的是如何实现功能,如何对于各种复杂甚至小众的场景都不出错。互联网中典型的后端、前端、平台、网络工程师的主要工作是这一类。

    如果一些功能已经实现了,你主要需要优化它,那这类工作一般比较偏向算法。其中一个关键是你的优化目标要是客观可量化的。比如一些代码优化的工作是提升代码的可维护性、可读性和可扩展性。这个优化目标具备比较强的主观性,难以形成量化的指标,属于设计模式主要关注的问题,一般不纳入算法范畴。

    另一个区分算法与非算法工作的重要特征是一般涉及数学知识较多的编程工作更偏向算法。比如对于面向优化的编程工作,为了很好地衡量可量化的目标,其数学定义往往比较明确,相应引入的数学知识会比较多。

    那么如果面向实现的编程工作也依赖大量数学知识时是否算作算法呢?其中一个例子是可计算性理论,它涉及到可判定性问题、数理逻辑等问题都需要大量复杂的数学知识。这种情况下,它其实更关心何种问题原则上是否可用算法解决,在实际工程领域中并没有大量的岗位与之相匹配,所以本文暂不将其作为算法工程师所考虑的范围。
    在这里插入图片描述

    另一个例子是加密算法。加密算法的目标是保证数据的安全通信,保证其加密性、完整性和身份唯一确认。看起来是面向实现,但换一个视角,加密算法设计的指导思想是提高其解密成本,也可以算是面向优化的。
    在这里插入图片描述

    不同种类算法之间的区别

    如果你的优化目标是要降低程序的时间复杂度与空间复杂度,它们都是能够比较严格地量化定义的,就属于经典的“数据结构与算法”中关注的“算法”的问题。LeetCode中大部分Algorithm的题目都属于此类,也是互联网面试中的高频考点,如常见的分治、递归、动态规划等。在实际工作中,特别是一些架构师相关的角色,会着重关注这类问题,比如提升增删改查的速度、降低其内存消耗等等。相应的数学理论是计算复杂性理论,依赖的数学知识包括离散数学、组合数学、图论等。

    如果你的优化目标是要降低在未见过的case上的预测误差,这是典型的机器学习中的算法问题。这里面涉及到一些核心的概念,包括:泛化误差、训练误差、过拟合、欠拟合、偏差等。相应的算法岗位非常多,图像算法、语音算法、自然语言处理算法、搜索推荐算法等。

    机器学习算法还可以根据优化目的的不同进行进一步的细分。如果训练数据带有标签,优化目标是降低预测标签的误差则是最常见的有监督学习。如果训练数据不带标签,则是无监督学习。而如果此时又非要预测对应的标签,则有降维聚类两种算法。如果仅仅是为了拟合训练数据的分布,生成式算法。

    它的数学理论是计算学习理论,依赖的数学知识包括概率与统计、最优化理论、线性代数与矩阵论等。
    在这里插入图片描述
    当然,最优化本身就是一种算法。稍微严格一点的表述是在一定的约束条件下控制自变量达到目标函数最优的问题。最优化问题也叫作运筹学,在工程界应用非常广泛。典型的如外卖骑手调度、网约车调度、航班调度、物流路径调度、广告/补贴金额投放等。
    在这里插入图片描述

    最优化算法的种类也比较多,以自变量是否连续可分为连续最优化和组合优化。很多计算复杂度优化算法可以看做一种广义的组合优化问题。机器学习算法一般是连续最优化问题。

    不同算法思路的相互组合

    其他一些的高阶算法可以理解为以上多种算法的组合。比如强化学习算法可以理解成机器学习中的有监督学习算法与最优化决策算法的组合。也就是智能体根据其对当前环境下长期最大收益进行决策(最优化),而这个收益的函数是需要通过大量样本统计(有监督学习)才能得到,并且智能体的当下决策往往影响周围的环境状态进而进一步影响下一步自身的决策。其典型应用场景是基于用户实时行为的个性化推荐与搜索,外卖骑手路径优化与订单分配的在线优化等。其实,“强人工智能”如果可行的话,强化学习是其绕不开的学习思路。

    以上介绍的优化算法都是基于单智能体的,而博弈论就将其拓展到多个智能体的最优化,视野一下就打开了。多个智能体的优化策略是会相互影响的。也就是说多智能体各自基于各自的优化函数进行优化,并且各自的优化行动可以影响其他智能体优化策略的过程。博弈论算法典型的应用场景是拍卖竞价策略。在ACG文化中的《大逃杀》、《赌博默示录》、《弥留之国的爱丽丝》甚至《JOJO》等大量作品中都充满了大量的博弈论场景。有一个小程序的游戏叫作《信任的进化》,简单玩一下就能够体会到博弈论的有趣之处。

    多智能体强化学习则是多个智能体的强化学习得到最优策略,并且各自的最优策略会影响对方智能体的下一步优化策略的过程。或者理解成其认为博弈论收益函数是不确定的,需要对通过大量样本统计(长期收益的有监督学习)。典型的案例是AlphaGo、AlphaZero之类。

    生成对抗网络(GAN)有点特殊,可以理解成两种机器学习算法的组合,一种算法的优化目标是降低生成样本与真实样本的区分难度,另一种算法的优化目标是提升他们的区分难度。而这两个目标是相互对立的,这又借鉴了博弈论的思路。这类算法在图像风格迁移、图像修复等场景有非常多的应用。

    另外,模型压缩算法可以理解成机器学算法与优化计算复杂度算法组合,在一定的误差容忍范围下显著降低模型的空间复杂度和推断时间复杂度。其典型应用场景是模型的实时运算加速、边缘部署压缩等。

    小结一下

    这里主要从面向优化的角度上串讲了以下12种思维方式不同的算法:加密算法、计算复杂度优化算法、最优化算法、有监督学习、无监督学习(降维、聚类、生成)、强化学习、博弈论、多智能体强化学习、生成对抗网络、模型压缩算法等。

    因为是科普向,很多细节没展开,特别是机器学习算法和优化计算复杂度算法的各个流派没有探讨。

    我们将在接下来的文章中进行更加详细的介绍。

    展开全文
  • 大多数据结构课本中,串涉及的内容即串的模式匹配,需要掌握的是朴素算法、KMP算法及next值的求法。在考研备考中,参考严奶奶的教材,我也是在关于求next值的算法中卡了一下午时间,感觉挺有意思的,把一些思考的...

    大多数据结构课本中,串涉及的内容即串的模式匹配,需要掌握的是朴素算法、KMP算法及next值的求法。在考研备考中,参考严奶奶的教材,我也是在关于求next值的算法中卡了一下午时间,感觉挺有意思的,把一些思考的结果整理出来,与大家一起探讨。

    本文的逻辑顺序为
    1、最基本的朴素算法
    2、优化的KMP算法
    3、应算法需要定义的next值
    4、手动写出较短串的next值的方法
    5、最难理解的、足足有5行的代码的求next值的算法
    所有铺垫为了最后的第5点,我觉得以这个逻辑下来,由果索因还是相对好理解的,下面写的很通俗,略显不专业…

    一、问题描述

    给定一个主串S及一个模式串P,判断模式串是否为主串的子串;若是,返回匹配的第一个元素的位置(序号从1开始),否则返回0;如S=“abcd”,P=“bcd”,则返回2;S=“abcd”,P=“acb”,返回0。

    二、朴素算法

    最简单的方法及一次遍历S与P。以S=“abcabaaaabaaacac”,P="abaabcac"为例,一张动图模拟朴素算法:

    在这里插入图片描述
    这个算法简单,不多说,附上代码

    #include<stdio.h>
    int Index_1(char s[],int sLen,char p[],int pLen){//s为主串,sLen为主串元素个数,p为模式串,pLen为模式串的个数
        if(sLen<pLen)return 0;
        int i = 1,j = 1;
        while(i<=sLen && j<=pLen){
            if(s[i]==p[j]){i++;j++;}
            else{
                i = i-j+2;
                j = 1;
            }
        }
        if(j>pLen) return i-pLen;
        return 0;
    }
    void main(){
        char s[]={' ','a','b','c','a','b','a','a','a','a','b','a','a','b','c','a','c'};//从序号1开始存
        char p[]={' ','a','b','a','a','b','c','a','c'};
        int sLen = sizeof(s)/sizeof(char)-1;
        int pLen = sizeof(p)/sizeof(char)-1;
        printf("%d",Index_1(s,sLen,p,pLen));
    }
    

    三、改进的算法——KMP算法

    朴素算法理解简单,但两个串都有依次遍历,时间复杂度为O(n*m),效率不高。由此有了KMP算法。
    一般的,在一次匹配中,我们是不知道主串的内容的,而模式串是我们自己定义的。
    朴素算法中,P的第j位失配,默认的把P串后移一位。
    但在前一轮的比较中,我们已经知道了P的前(j-1)位与S中间对应的某(j-1)个元素已经匹配成功了。这就意味着,在一轮的尝试匹配中,我们get到了主串的部分内容,我们能否利用这些内容,让P多移几位(我认为这就是KMP算法最根本的东西),减少遍历的趟数呢?答案是肯定的。再看下面改进后的动图:
    在这里插入图片描述

    这个模拟过程即KMP算法,若没有看明白,继续往下看相应的解释,理解需要把P多移几位,然后回头再看一遍这个图就很明了了。

    相比朴素算法:
    朴素算法: 每次失配,S串的索引i定位的本次尝试匹配的第一个字符的后一个。P串的索引j定位到1;T(n)=O(n*m)
    KMP算法: 每次失配,S串的索引i不动,P串的索引j定位到某个数。T(n)=O(n+m),时间效率明显提高

    而这“定位到某个数”,这个数就是接下来引入的next值。(实际上也就是P往后移多少位,换一种说法罢了:从上图中也可以看出,失配时固定i不变,令S[i]与P[某个数]对齐,实际上是P右移几位的另一种表达,只有为什么这么表达,当然是因为程序好写。)

    开——始——划——重——点!(图对逻辑关系比较好理解,但i和j的关系对后面求next的算法好理解!)

    • 比如,Pj处失配,绿色的是Pj,则我们可以确定P1…Pj-1是与Si…Si+j-2相对应的位置一一相等的
      在这里插入图片描述

    • 假设P1…Pj-1中,P1…Pk-1与Pj-k+1…Pj-1是一一相等的,为了下面说的清楚,我们把这种关系叫做“首尾重合”
      在这里插入图片描述

    • 那么可以推出,P1…Pk-1与Si…Si+j-2
      在这里插入图片描述

    • 显然,接下来要做的就是把模式串右移了,移到哪里就不用多说了:
      在这里插入图片描述

    • 为了表示下一轮比较j定位的地方,我们将其定义为next[j],next[j]就是第j个元素前j-1个元素首尾重合部分个数加一,当然,为了能遍历完整,首尾重合部分的元素个数应取到最多,即next[j]应取尽量大的值,原因挺好理解的,可以想个例子模拟一下,会完美跳过正确结果。在上图中就是绿色元素的next值为蓝色元素的序号。也即,对于字符串P,next[8]=4。如此,再看一下上面的动图是不是清楚了不少。

    • 最后,如果我们知道了一个字符串的next值,那么KMP算法也就很好懂了。相比朴素算法,当发生失配时,i不变,j=next[j]就好啦!接下来就是怎么确定next值了。

    四、手动写出一个串的next值

    我们规定任何一个串,next[1]=0。(不用next[0],与串的所有对应),仍是一张动图搞定问题:
    在这里插入图片描述
    这个扫一眼就能依次写出,会了这个方法,应付个期末考试没问题了。

    通过把next值“看”出来,我们再来分析next值,这就很容易得到超级有名的公式了,这个式子对后面的算法理解很重要!所以先要看懂这个式子,如果上面的内容通下来了,这个应该很容易看懂了:
    在这里插入图片描述

    五、求next的算法

    终于到了最后了~短的串的next值我们可以“看”出来,但长的串就需要借助程序了,具体算法刚接触的时候确实不容易理解,但给我的体验,把上面的内容写完,现在感觉简简单单了…先附上程序再做解释,(终于到了传说中的整整5行代码让我整理了一下午)。

    int GetNext(char ch[],int cLen,int next[]){//cLen为串ch的长度
        next[1] = 0;
        int i = 1,j = 0;
        while(i<=cLen){
            if(j==0||ch[i]==ch[j]) next[++i] = ++j;
            else j = next[j];
        }
    }
    
    • 还是先由一般再推优化:
      直接求next[j+1](至于为什么是j+1,是为了和下面的对应)
      根据之前的分析,next[j+1]的值为pj+1的前j个元素的收尾重合的最大个数加一。即需要满足两个条件,把它的值一步步“检验”出来。一是“个数最多”的,因此要从可能的最大值开始验;二是“首尾重合”,因此要一一对应验是否相等。
      不难理解,next[j+1]的最大值为j,所有我们从next[j+1]=j开始“验证”。有以下优先判断顺序:
      if(P1…Pj-1 == P2…Pj) => next[j+1]=j
      else if(P1…Pj-2 == P3…Pj) =>next[j+1]=j-1
      else if(P1…Pj-3 == P4…Pj) =>next[j+1]=j-2



      else if(P1P2 == Pj-1Pj) => next[j+1]=3
      else if(P1 == Pj-1) => next[j+1]=2
      else if(P1 != Pj-1) => next[j+1]=1

      每次前去尾1个,后掐头1个,直至得到next[j+1]

    • 再进一步想,next值是一个“工具”,我们单独的求next[j+1]是完全没有意义的,就是说要求next就要把所有j的next求出来。所有一般的,我们都是已知前j个元素的next值,求next[j+1],以此递推下去,求完整的next数组
      但是,上面的思考过程还是最根本的。所以问题变为两个:知道前j个元素的next的情况下,
      ①next[j+1]的可能的最大值是多少(即从哪开始验证)
      ②某一步验证失败后,需要“前去尾几个,后掐头几个?”(即本次验证失败后,再验证哪个值)
      看一下的分析:

    1、next[j+1]的最大值为next[j]+1。
    因为:
    假设next[j]=k1,则可以说明P1…Pk1-1=Pj-k1+1…Pj-1,且这是前j个元素最大的首尾重合序列。
    如果Pk1=Pj,那么P1…Pk1-1PK=Pj-k1+1…Pj-1Pj,那么k+1这也是前j+1个元素的最大首尾重合序列,也即next[j+1]的值为k1+1
    2、如果Pk1≠Pj,那么next[j+1]可能的次大值为next[next[j]]+1,以此类推即可高效求出next[j+1]
    这里不好解释,直接看下面的流程分析及图解

    开——始——划——重——点!
    从头走一遍流程
    ①求next[j+1],设值为m
    已知next[j]=k1,则有P1…Pk1-1 = Pj-k1+1…Pj-1
    如果Pk1=Pj,则P1…Pk1-1PK = Pj-k1+1…Pj-1Pj,则next[j+1]=k1+1,否则
    已知next[k1]=k2,则有P1…Pk2-1 = Pk1-k2+1…Pk1-1
    ⑤第二第三步联合得到:
    P1…Pk2-1 = Pk1-k2+1…Pk1-1 = Pj-k1+1…Pk2-k1+j-1 = Pj-k2+1…Pj-1 即四段重合
    ⑥这时候,再判断如果Pk2=Pj,则P1…Pk2-1P~k2 = Pj-k2+1…Pj-1Pj,则next[j+1]=k2+1;否则再取next[k2]=k3…以此类推

    上面几步,耐心看下来,结合那个式子很容易看懂。最后,再加一个图的模拟帮助理解:
    1、要求next[k+1] 其中k+1=17
    在这里插入图片描述
    2、已知next[16]=8,则元素有以下关系:
    在这里插入图片描述
    3、如果P8=P16,则明显next[17]=8+1=9
    4、如果不相等,又若next[8]=4,则有以下关系

    在这里插入图片描述
    又加上2的条件知
    在这里插入图片描述
    主要是为了证明:
    在这里插入图片描述
    5、现在在判断,如果P16=P4则next[17]=4+1=5,否则,在继续递推
    6、若next[4]=2,则有以下关系
    在这里插入图片描述
    7、若P16=P2,则next[17]=2+1=3;否则继续取next[2]=1、next[1]=0;遇到0时还没出结果,则递推结束,此时next[17]=1。最后,再返回看那5行算法,应该很容易明白了!

    展开全文
  • 2020最新-精选基础算法100题(面试必备)

    万次阅读 多人点赞 2020-05-18 19:58:16
    作为一个程序员,算法能力必不可少,虽然不一定是算法工程师,但是算法还是彰显着个人的编码能力,面试中也经常会被问到,甚至会被要求临场做算法题,所以,还是好好积累吧。 个人其实对算法挺有兴趣的,从3月份...

    0x01.概述

    作为一个程序员,算法能力必不可少,虽然不一定是算法工程师,但是算法还是彰显着个人的编码能力,面试中也经常会被问到,甚至会被要求临场做算法题,所以,还是好好积累吧。

    • 个人其实对算法挺有兴趣的,从3月份开始,陆陆续续刷了一些算法题,把一些有意义的记录下来了,也顺便写了一些题解,个人认为,还是挺有收获的。
    • 之前写了一篇算法文章的目录,不过后来就忘了实时去更新了,于是现在,想把之前做过的一些有意义的算法题分享出来,刚好整理了100篇比较有意义的。希望对大家有所帮助。

    在这里插入图片描述

    0x02.说明

    • 关于语言的选择:

      • 前半段主要用C++写的,后半段主要用Java写的。
      • 其实什么语言没有太大区别,主要是思想,用着顺手就行。
      • 这里安利一波Java,哈哈,Java写算法题写多了,真的比较舒适。
    • 关于文章类型的选择:

      • 选取了一些较为基本的算法类型,都是比较常见的。
      • 不涉及ACM等难度太高的题,大佬们移步哈。
      • 都是一些比较经典的问题。
    • 关于题目的来源:

      • 平时主要刷题的平台是Leetcode,因为是函数式的,比较方便。
      • 还有一些是在《剑指offer》,《程序员面试金典》中看到比较好的,所有题目后面都给出了出处。
    • 关于题解的说明:

      • 题解是我自己所写,有时候也参考了一些官方题解的思想,可能更好理解。
      • 题解的代码都提交测试过的,保证暂时没有问题。
      • 个人水平有限,可能文章里面存在一些问题,还望大佬多多指点。
      • 每个题目附带了原文链接,不喜欢阅读我题解的小伙伴们也可以直接移步原出处哈。
    • 关于算法能力提升的一些意见:

      • 个人认为,算法来说,思想最为重要,有算法的严谨思想,才是算法能力提升的基础。
      • 刷题就是培养算法思想的一种实际行动。
      • 好好理解透一个问题,或者一类问题,远胜于你麻木的刷大量的题。
      • 算法确实也有模板题,只需要照着模板就能做出,但问题是,照着模板就一定能做出来嘛,是否真正理解了为什么这个模板可以通用。
    • 关于分类:

      • 有些分类确实不太好分,所以就单独列出来了。
      • 主要的还是区分开来了。

    0x03.正文–精选算法100题(附个人题解)

    分类一:动态规划(dp)

    没错,就是你熟悉的dp,dp说简单也简单,说难也实在是太难了,重点是如何找到里面的状态转移方程。经过这些题目的训练,希望你能有一些初步的dp思路了。

    题目名称来源个人题解备注
    01.打家劫舍Leetcode题198:戳我前往戳我前往估计是最好的dp入门题型了
    02.斐波拉契数列经典问题戳我前往确实比较经典哦~
    03.零钱兑换问题Leetcode题322:戳我前往戳我前往也是一个比较经典的问题了
    04.零钱兑换IILeetcode题518:戳我前往戳我前往零钱问题通用解法
    05.最长上升子序列Leetcode题300:戳我前往戳我前往堪称数组dp中的典范
    06.牌型种数蓝桥杯:链接暂无戳我前往二维动态规划,要仔细想想
    07.最低票价Leetcode题983:戳我前往戳我前往如何状态转移?
    08.不同的二叉搜索树Leetcode题152:戳我前往戳我前往你会发现dp的神奇之处
    09.礼物的最大价值《剑指offer》题47戳我前往优化dp的思路
    10.接雨水Leetcode题42:戳我前往戳我前往需要仔细思考以发现dp
    11.编辑距离Leetcode题72:戳我前往戳我前往最为经典的二维dp题型
    12.买卖股票的最佳时机(6题)Leetcode6题:戳我前往戳我前往统一化的dp思维,棒
    13.鸡蛋掉落Leetcode题887:戳我前往戳我前往有些难度哦~
    14.最大正方形Leetcode题221:戳我前往戳我前往矩阵中的dp思路
    15.和为K的子数组Leetcode题560:戳我前往戳我前往前缀和也是dp的思路

    分类二:搜索类(DFS,BFS,回溯,暴力搜索)

    搜索类的算法题应该是随便哪个算法比赛都可以看到,虽然经典,但在这上面还是会有比较难的问题,所以,掌握基本思路和套路就显得格外重要。

    题目名称来源个人题解备注
    16.图的深搜和广搜经典问题戳我前往搜索中的经典问题
    17.方格填数蓝桥杯:链接暂无戳我前往揣摩一下DFS的思路
    18.路径之谜蓝桥杯:链接暂无戳我前往经典改编迷宫问题
    19.岛屿的最大面积Leetcode题695:戳我前往戳我前往最常见的矩阵中的DFS
    20.逃离大迷宫Leetcode题1036:戳我前往戳我前往各种搜索思想都可以应用
    21.单词搜索Leetcode题79:戳我前往戳我前往字符串中的搜索
    22.检查网格中是否存在有效路径Leetcode题1391:戳我前往戳我前往思考另类的搜索
    23.地图分析Leetcode题1162:戳我前往戳我前往多源BFS
    24.机器人的运动范围《剑指offer》13题戳我前往DFS进行计数的基本思路
    25.括号生成Leetcode题22:戳我前往戳我前往用DFS生产括号
    26.01 矩阵Leetcode题542:戳我前往戳我前往矩阵中的搜索
    27.岛屿数量Leetcode题200:戳我前往戳我前往根据需求使用DFS
    28.全排列问题Leetcode题46:戳我前往戳我前往最经典的回溯算法

    分类三:字符串

    别忽视字符串的算法问题,它难起来可以非常难,简单的也很简单,面试喜欢提问,而且特别容易出错,需要引起重视。

    题目名称来源个人题解备注
    29.KMP算法经典算法戳我前往经典字符串匹配算法
    30.拼写单词Leetcode题1160:戳我前往戳我前往很简单的字符串问题
    31.竖直打印单词Leetcode题1324:戳我前往戳我前往简单但值得思考
    32.不含 AAA 或 BBB 的字符串Leetcode题984:戳我前往戳我前往巧妙构造出字符串
    33.实现Trie(前缀树)Leetcode题208:戳我前往戳我前往字符串中经典的算法
    34.最长快乐前缀Leetcode题1392:戳我前往戳我前往如何处理字符串的前后缀
    35.单词搜索IILeetcode题212:戳我前往戳我前往前缀树的应用
    36.单词的压缩编码Leetcode题820:戳我前往戳我前往前缀树灵活运用
    37.判定字符是否唯一《程序员面试金典》01.02戳我前往简单但值得思考
    38.判定是否互为字符重排《程序员面试金典》 01.02戳我前往简单的面试题
    39.无重复字符的最长子串Leetcode题3:戳我前往戳我前往字符串中的滑动窗口
    40.字符串转换整数Leetcode题8:戳我前往戳我前往需要考虑的细节很多
    41.翻转字符串里的单词Leetcode题151:戳我前往戳我前往正则匹配
    42.整数转换英文表示Leetcode题273:戳我前往戳我前往非常实用的算法题
    43.统计重复个数Leetcode题466:戳我前往戳我前往循环结剪枝
    44.超级回文数Leetcode题906:戳我前往戳我前往字符串与大数的处理思路
    45.单词子集Leetcode题96:戳我前往戳我前往特征思想的应用

    分类四:容器类(哈希表,栈,队列,Map,Set)

    容器类的算法题一般需要根据一些容器的特点来解决响应的问题,还有需要选择合适的容器进行新的数据结构的设计,掌握它们的使用,非常重要。

    题目名称来源个人题解备注
    46.按位与为零的三元组Leetcode题82:戳我前往戳我前往哈希表优化
    47.设计地铁系统Leetcode题1396:戳我前往戳我前往合理选择容器
    48.LFU缓存《程序员面试金典》戳我前往选择容器来设计
    49.设计推特Leetcode题355:戳我前往戳我前往很实用的算法
    50.最小栈Leetcode题155:戳我前往戳我前往两栈设计最小栈
    51.子数组的最小值之和Leetcode题907:戳我前往戳我前往单调栈的应用
    52.栈的压入、弹出序列《剑指offer》戳我前往栈的合法序列
    53.有效括号的嵌套深度Leetcode题1111:戳我前往戳我前往模仿栈
    54.逆波兰算法经典算法戳我前往后缀表达式关键算法

    分类五:数学思维类(含位运算思想)

    数学思维类的题由于需要很强大的数学思维,但是这又不是一天可以练成的,所以,也常常在面试中会被问到,只有慢慢的积累,才是王道。

    题目名称来源个人题解备注
    55.水壶问题Leetcode题365:戳我前往戳我前往经典数学问题
    56.三维形体的表面积Leetcode题892:戳我前往戳我前往空间思想解决算法问题
    57.生命游戏Leetcode题289:戳我前往戳我前往数学思维的运用
    58.交点《程序员面试金典》16.03戳我前往二维平面的交点问题
    59.使数组唯一的最小增量Leetcode题945:戳我前往戳我前往数学思维的运用
    60.数值的整数次方《剑指offer》题16戳我前往非常容易出错的面试题
    61.求 1+2+…+n《剑指offer》戳我前往短路原则
    62.1~n整数中1出现的次数《剑指offer》戳我前往数学思维找规律
    63.数组中数字出现的次数《剑指offer》戳我前往分组异或

    分类六:链表

    链表是一种非常常见的数据结构,不管在实际应用还是算法竞赛中,都经常出现,掌握对它们的基本处理,非常重要。

    题目名称来源个人题解备注
    64.两数相加Leetcode题2:戳我前往戳我前往链表的加法问题
    65.链表的中间结点Leetcode题876:戳我前往戳我前往快慢指针思想
    66.删除链表的倒数第N个节点Leetcode题19:戳我前往戳我前往哑节点和双指针
    67.合并两个有序链表Leetcode题21:戳我前往戳我前往链表的递归处理
    68.合并K个排序链表Leetcode题23:戳我前往戳我前往优先队列的使用
    69.删除排序链表中的重复元素 IILeetcode题82:戳我前往戳我前往链表基础指针操作
    70.分隔链表Leetcode题86:戳我前往戳我前往双指针操作
    71.旋转链表Leetcode题61:戳我前往戳我前往巧转循环链表
    72.两两交换链表中的节点Leetcode题24:戳我前往戳我前往递归解决
    73.反转链表Leetcode题206:戳我前往戳我前往多种思路反转链表
    74.K 个一组翻转链表Leetcode题25:戳我前往戳我前往分组逆转
    75.判断链表是否有环《剑指offer》戳我前往多种思路判断链表是否有环
    76.单链表的插入排序Leetcode题147:戳我前往戳我前往链表的插入排序
    77.两数相加 IILeetcode题445:戳我前往戳我前往用栈翻转链表元素

    分类七:树

    树也是一种非常重要的数据结构,因为很多容器的底层都设计到树,所以树也成了面试常问的重点了,你需要对他们的一些基本算法题,非常熟练。

    题目名称来源个人题解备注
    78.删除给定值的叶子结点Leetcode题1325:戳我前往戳我前往树的简单删除问题
    79.二叉树的最大最小深度Leetcode题104:戳我前往戳我前往二叉树的深度问题
    80.将有序数组转换为二叉搜索树Leetcode题108:戳我前往戳我前往数组和二叉树的转换
    81.二叉树的右视图Leetcode题199:戳我前往戳我前往二叉树的视图转换
    82.另一个树的子树Leetcode题572:戳我前往戳我前往两树关系的判断
    83.二叉树的最近公共祖先《剑指offer》戳我前往公共祖先问题
    84.二叉树的层序遍历序列存储Leetcode题102:戳我前往戳我前往二叉树遍历序列的存储
    85.验证二叉搜索树Leetcode题98:戳我前往戳我前往二叉搜索树的验证

    分类八:数组(贪心,二分)

    数组类的算法题也是,说难不难,说简单不简单,而且数组是平时编码用的最多的结构了,所以,需要对它的一些基本算法引起重视。

    题目名称来源个人题解备注
    86.两个数组间的距离值Leetcode题1385:戳我前往戳我前往二分法应用
    87.旋转矩阵《程序员面试金典》戳我前往原地修改
    88.合并区间Leetcode题56:戳我前往戳我前往排序处理数组问题
    89.跳跃游戏Leetcode题55:戳我前往戳我前往贪心思想运用
    90.盛最多水的容器Leetcode题11:戳我前往戳我前往双指针
    91.统计「优美子数组」Leetcode题1248:戳我前往戳我前往滑动窗口
    92.搜索旋转排序数组Leetcode题33:戳我前往戳我前往二分搜索
    93.山脉数组中查找目标值Leetcode题1095:戳我前往戳我前往二分搜索
    94.快乐数Leetcode题202:戳我前往戳我前往快慢指针判断成环思路
    95.跳跃游戏 IILeetcode题45:戳我前往戳我前往贪心思想
    96.x 的平方根Leetcode题69:戳我前往戳我前往二分法取平方根
    97.数组中的逆序对《剑指offer》题51戳我前往归并中的计数(分治)
    98.课程表 IILeetcode题210:戳我前往戳我前往数组中的拓扑排序

    分类九:经典算法列举

    最后两个,凑个整,刚好100,是一些比较经典的算法列举。

    题目名称来源个人题解备注
    99.普利姆算法经典算法戳我前往最小生成树经典算法
    100.约瑟夫环经典算法戳我前往很经典的动态问题

    0x04.End

    希望这100个算法题能对正在看的你有所帮助!
    后续还会继续更新更多的内容。
    您的支持,是我分享的不竭动力!

    • – ATFWUS 2020-05-18
    展开全文
  • Dijkstra算法(迪杰斯特拉算法

    万次阅读 多人点赞 2019-06-24 18:06:30
    对比算法好坏需要考虑的因素 执行算法所耗费的时间 执行算法所耗费的存储空间 Dijkstra算法(迪杰斯特拉算法) 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959年提出的,是从一个顶点到其余各顶点的最短路径...
  • dijkstra算法详解(普通算法和堆优化算法

    万次阅读 多人点赞 2018-09-15 15:10:02
    今天开始不定期写一写我对各种基本数据结构与算法的详解。 当初一无所知的我也是看着各位网上CSDN的博主写的博客...所以,现在虽然不会经常做算法题和搞OI了,但是还是想把自己对各路算法的心得,回馈给大家。 希...
  • 最优化算法之粒子群算法(PSO)

    万次阅读 多人点赞 2018-08-03 10:26:45
    一、粒子群算法的概念   粒子群优化算法(PSO:Particle swarm optimization) 是一种进化计算技术(evolutionary computation)。源于对鸟群捕食的行为研究。粒子群优化算法的基本思想:是通过群体中个体之间的...
  • 智能优化算法:麻雀搜索算法-附代码

    万次阅读 多人点赞 2020-09-27 16:34:00
    2020智能优化算法:麻雀搜索算法-附代码 文章目录2020智能优化算法:麻雀搜索算法-附代码1.算法原理2.算法结果3.参考文献4.Matlab代码 摘要:麻雀搜索算法(Sparrow Search Algorithm, SSA)是于2020年提出的。SSA ...
  • 由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,...
  • Dijkstra算法原理

    万次阅读 多人点赞 2017-02-19 22:46:13
    Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法是很有代表性...
  • 算法 BF算法

    千次阅读 2018-04-18 17:29:35
    BF算法是字符匹配的一种算法,也称暴力匹配算法算法思想:从主串s1的pos位置出发,与子串s2第一位进行匹配若相等,接着匹配后一位字符若不相等,则返回到s1前一次匹配位置的后一位,接着与s2的起始位进行匹配直到与...
  • 页面置换算法-CLOCK置换算法及其改进版算法

    万次阅读 多人点赞 2018-12-29 13:31:51
    页面置换算法中的LRU算法最接近理想情况下的OPT算法,但是实现起来比较困难且开销较大,所以很多设计者试图用开销比较小的算法接近LRU算法,CLOCK算法就是其中一种。 1.简单的CLOCK算法是通过给每一个访问的页面...
  • 算法算法评价

    万次阅读 多人点赞 2019-07-05 20:42:11
    一、算法的基本概念 算法是对特定问题求解步骤的一种描述,它是指令的有限序列,其中的每条指令表示一个或多个操作。具有以下性质: 1.有穷性:一个算法必须总是在执行有穷步之后结束,且每一步都可在有穷时间内...
  • 数据挖掘算法——常用分类算法总结

    万次阅读 多人点赞 2019-06-17 10:55:22
    常用分类算法总结分类算法总结NBC算法LR算法SVM算法ID3算法C4.5 算法C5.0算法KNN 算法ANN 算法 分类算法总结 分类是在一群已经知道类别标号的样本中,训练一种分类器,让其能够对某种未知的样本进行分类。分类算法...
  • Mysql算法内部算法 - 嵌套循环连接算法1.循环连接算法// 循环连接算法分为两种 1.嵌套循环连接算法 2.块嵌套循环连接算法2.嵌套循环连接算法一个简单的嵌套循环连接(NLJ)算法从一个循环中的第一个表中读取一行中的...
  • 遗传算法

    万次阅读 多人点赞 2019-04-06 21:41:47
    使用遗传算法求解多峰函数的最大值,是我的一项课程作业,完之后,顺便把文档整理出来个记录。全部内容如下: 1、问题描述 编程实现遗传算法,并求解多峰函数的最大值。多峰函数的表达式如下所示: 用MATLAB...
  • 夜深人静写算法(三)- 初等数论入门

    万次阅读 多人点赞 2017-12-28 15:33:22
    初等数论:扩展欧几里得算法,中国剩余定理,欧拉函数,容斥原理,大数判素
  • Dijkstra算法

    万次阅读 2021-02-17 12:18:58
    戴克斯特拉算法(Dijkstra’s algorithm)是由荷兰计算机科学家艾兹赫尔·戴克斯特拉提出。迪科斯彻算法使用了广度优先搜索解决非负权有向图的单源最短路径问题,算法最终得到一个最短路径树。该算法常用于路由算法...
  • 趣写算法系列之--匈牙利算法

    万次阅读 多人点赞 2013-07-18 13:39:59
    【书本上的算法往往讲得非常复杂,我和我的朋友计划用一些简单通俗的例子来描述算法的流程,这只是刚开始的样稿,其实我们也才刚开始】 匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名。匈牙利算法是...
  • 初级算法学习步骤

    千次阅读 多人点赞 2018-07-29 18:51:51
    前言 零散整理一个多月终于整理完了。...一直没时间吧之前的总结整理出来,现在准备整理一下用java做算法的一些东西……学习了两个月左右算法,从啥都不会到小白再到算是初级……一个总结,请高手多多指...
  • C语言算法 欧几里得算法

    千次阅读 2018-03-07 16:30:46
    算法背景:古希腊数学家,亚历山大港的欧几里得所著的《几何原本》,以系统系统论述几何学而著称,在其中的一卷中,他简要概述了一个求最大公约数的算法算法思想:欧几里得算法的思想是重复使用下列等式,知道n%m=...
  • 设计一个使大楼里所有人等待时间最短的算法,同时要考虑每一层的负载量。假定每一层人数相同且每层的人以同样的方式使用电梯。假设每天有几个小时是“高峰时段”,算法需要提供一种最“公平”的方式来将电梯分配到...
  • LBG算法、Lloyd算法和K均值算法

    万次阅读 2017-07-25 02:07:56
    关于LBG算法,Lloyd算法和K均值算法的简介
  • 遗传算法 遗传算法是计算数学中用于解决最佳化的搜索算法,是进化算法的一种。进化算法最初是借鉴了进化生物学中的一些现象而发展起来的,这些现象包括遗传、突变、自然选择以及杂交等。遗传算法通常实现方式...
  • 目录:一、简介二、二位式控制算法三、位置式PID算法1. P算法2. I 算法3. D算法四、增量式PID算法五、几种增量式PID算法的变形 一、简介 将偏差的 比例(Proportion)、积分(Integral) 和 微分(Differential) ...
  • 对称加密算法之DES算法和AES算法

    千次阅读 2019-01-22 13:44:36
    在对称加密算法中,数据发送方将明文和加密密钥一起经过特殊加密算法处理后,生成复杂的加密密钥进行发送,数据接收方收到密文后,若想读取原文,则需要使用加密使用的密钥及相同算法的逆算法对加密的密文进行解密,...
  • 排序算法系列:快速排序算法

    万次阅读 多人点赞 2016-03-01 15:40:07
     在前面说到了两个关于交换排序的算法:冒泡排序与奇偶排序。  本文就来说说交换排序的最后一拍:快速排序算法。之所以说它是快速的原因,不是因为它比其他的排序算法都要快。而是从实践中证明了快速排序在平均...
  • 史密斯-沃特曼算法(Smith-Waterman algorithm)是一种进行局部序列比对(相对于全局比对)的算法,该算法的目的不是进行全序列的比对,而是找出两个序列中具有高相似度的片段。 尼德曼-翁施算法(Needleman-Wunsch...
  • 最短路径算法 Dijkstra算法 Floyd算法 简述

    万次阅读 多人点赞 2017-01-29 06:22:47
    Dijkstra算法 又称迪杰斯特拉算法,是一个经典的最短路径算法,主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止,使用了广度优先搜索解决赋权有向图的单源最短路径问题,算法最终得到一个最短路径树。...
  • hash算法原理详解

    万次阅读 多人点赞 2016-05-19 22:35:01
    一.概念 哈希表就是一种以 键-值(key-indexed) 存储数据的结构,我们只要输入待查找的值即key,即可查找到其对应的值。 哈希的思路很简单,如果所有的键都是整数,那么就可以使用一个简单的无序数组来实现:将键作为...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,792,474
精华内容 1,916,989
关键字:

做算法的