怎样系统地学习算法( 二 )


选择一个增量序列t1,t2,…,tk,其中ti\u0026gt;tj,tk=1;按增量序列个数k,对序列进行k趟排序;每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m的子序列,分别对各子表进行直接插入排序。仅增量因子为1时,整个序列作为一个表来处理,表长度即为整个序列的长度。动图演示如下:



希尔排序算法较为晦涩难懂,而且并不是最优的排序算法,现在已经被后来的快速排序算法给淘汰了。然而不可否认希尔对排序算法的演进具有开创性贡献,在攀越算法高峰的路上,每一步都走得战战兢兢,我们只有铭记这些伟大的引路人,以此激励自己不断前行。
算法世界不尽完美。不仅有经典算法在前奠基,后起之秀遗传算法、深度学习算法也熠熠生辉。算法世界还有许多"所罗门王的宝藏",一直静静地守候在"灯火阑珊处",等待着人们去发掘。
四、学习方法我给大家整理了一个学习计划,可以保存下图进行学习:



现在网上有很多资源、博客、论坛可供我们更方便地学习知识片段。然而这种类似兵来将挡、水来土掩般的学习方法虽然有用,却并不特别的好。这里推荐大家在网上寻找一些系统的学习教程,以帮助自己由浅入深,一路成长。

五、真题演练力扣将TopInterviewQuestions里比较新的题目按照类别进行了整理,以供大家按模块练习。
模拟134.加油站146.LRU缓存机制202.快乐数289.生命游戏371.两整数之和412.FizzBuzz数组152.乘积最大子序列169.求众数189.旋转数组217.存在重复元素283.移动零384.打乱数组350.两个数组的交集II334.递增的三元子序列240.搜索二维矩阵II238.除自身以外数组的乘积链表138.复制带随机指针的链表141.环形链表148.排序链表160.相交链表206.反转链表234.回文链表237.删除链表中的节点328.奇偶链表堆155.最小栈215.数组中的第K个最大元素295.数据流的中位数378.有序矩阵中第K小的元素347.前K个高频元素栈150.逆波兰表达式求值227.基本计算器II341.扁平化嵌套列表迭代器哈希/Map171.Excel表列序号454.四数相加II380.常数时间插入、删除和获取随机元素队列239.滑动窗口最大值树230.二叉搜索树中第K小的元素236.二叉树的最近公共祖先297.二叉树的序列化与反序列化线段树218.天际线问题排序179.最大数324.摆动排序II二分检索162.寻找峰值287.寻找重复数315.计算右侧小于当前元素的个数滑动窗口395.至少有K个重复字符的最长子串动态规划124.二叉树中的最大路径和128.最长连续序列198.打家劫舍279.完全平方数300.最长上升子序列322.零钱兑换329.矩阵中的最长递增路径图论127.单词接龙200.岛屿的个数207.课程表210.课程表II数学\u0026amp;位运算136.只出现一次的数字149.直线上最多的点数166.分数到小数172.阶乘后的零190.颠倒二进制位191.位1的个数204.计数质数268.缺失数字326.3的幂字符串125.验证回文串131.分割回文串139.单词拆分140.单词拆分II208.实现Trie(前缀树)212.单词搜索II242.有效的字母异位词387.字符串中的第一个唯一字符344.反转字符串力扣君特别为大家总结了“高频算法面试题汇总”卡片,在力扣探索频就可以找到,希望对各位即将面试或者学习算法的程序员小伙伴有帮助。
探索算法面试题汇总-力扣(LeetCode)欢迎各位知友关注力扣官方微信公众号:「LeetCode力扣」,更多关于程序员面试、技术干货的内容等你来啃!

■学习算法,切记不要一上来就开始啃《算法导论》,毕竟这本书并不适合新手学习,如果你之前的算法基础比较薄弱,只会一直陷在“拿起来又放下”的循环里。
可以怎么入门呢?建议还是看书+实战,实战当然也不是说要去肝ACM或者是topcoder什么的,基本上来我们LintCode刷刷题也就够了。
如何学习算法?
算法,其实可以分为三种。算法、面试算法、竞赛算法。
算法也就是算法本身,推荐一些书籍。
1.入门系列:
《算法图解》:“像小说一样有趣的算法入门书”,主打“图解”,通俗易懂
《大话数据结构》:把理论讲得有趣不枯燥;每个数据结构和算法,作者都结合了生活中的例子,能让你有非常直观的感受。
2.教科书系列:
《数据结构与算法分析》:很多大学都拿它当作教材,非常系统、全面、严谨,适合掌握了至少一门编程语言的同学。
作者也很贴心,这本书有三种语言的版本:《数据结构与算法分析:C语言描述》《数据结构与算法分析:C++描述》《数据结构与算法分析:Java语言描述》。
3.进阶之旅:
《算法导论》:有了一定基础之后,就可以开始啃这本大部头了。
5.扩展阅读:
《算法之美》:算法科普,从生活中的各种问题说起:租房、谈恋爱、老虎机、拍电影、面试、买彩票、各种排序、找停车位、寻找新药、临床试验、奥巴马拉赞助、预估电影票房等等,非常生活化,可以作为补充阅读。
《算法帝国》:同样是科普类书籍,并无涉及算法的原理与实现细节,也可以作为补充阅读。
6.殿堂级
《计算机程序设计艺术》:包含很多卷,深度、广度、系统性、全面性是其他所有数据结构和算法书籍都所无法相比。可以当做一种挑战~



图源网络,侵删面试算法要说最快掌握面试算法的捷径,还是脚踏实地着多动手去刷题,多刷题。
当然,在LintCode开始刷题,首先你也也得具备一定的基础,这些基础包括:
算法部分
二分搜索BinarySearch分治DivideConquer宽度优先搜索BreadthFirstSearch深度优先搜索DepthFirstSearch回溯法Backtracking双指针TwoPointers动态规划DynamicProgramming扫描线Scan-linealgorithm快排QuickSort数据结构部分
栈Stack队列Queue链表LinkedList数组Array哈希表HashTable二叉树BinaryTree堆Heap并查集UnionFind字典树Trie对算法题来说有两大法宝,“拿到题选什么算法”和“如何实现这个算法”,后者会更容易一些,所以可以先从实现算法开始练起(LintCode的分类阶梯训练)。
然后当一些标准算法数据结构都不陌生后,再去训练新题,尝试用各种算法解决各种不同的问题。
当然,针对面试准备,也有一些书:
《剑指Offer》:几乎包含所有常见的、经典的面试题,是应对面试的必读书籍
《编程之美》:适合准备面试FLAG大厂时候用来刷题
ps:这两本书都可以配合在LintCode上刷题



竞赛算法算法学习最好由浅入深,先了解算法思维,再去理解实际应用;
当逐步全面的掌握相关知识体系,有一定实践经验后,可以去参加一些竞赛提升自己的算法能力。
竞赛算法是比较锻炼人的,对于竞赛来说,每道题对输入参数和样本量的要求都非常明确,包括对空间的限制和运行时间的限制也规定的非常明确。每一个竞赛选手都非常熟练怎么根据这些提前给好的限制,反推出自己需要实现一个什么样复杂度的解法才能通过。所以对思维和逻辑上的锻炼是非常有效的。
献上一些面试常考算法类型和经典题,愉快地刷起来吧~
数学尾部的零斐波纳契数列x的平方根大整数乘法骰子求和最多有多少个点在一条直线上超级丑数
比特位操作将整数A转换为B更新二进制位二进制表示O(1)时间检测2的幂次二进制中有多少个1
动态规划编辑距离正则表达式匹配交叉字符串乘积最大子序列二叉树中的最大路径和不同的路径通配符匹配
堆滑动窗口的中位数数据流中位数最高频的K个单词接雨水堆化排序矩阵中的从小到大第k个数
二叉树二叉树中序遍历二叉树的序列化和反序列化子树最近公共祖先二叉树的层次遍历将二叉树拆成链表在二叉查找树中插入节点
二分法经典二分查找问题二分查找两数组的交区间最小数寻找旋转排序数组中的最小值搜索排序区间寻找峰值
分治法快速幂两个排序数组的中位数合并K个排序链表
哈希表变形词子串哈希函数短网址复制带随机指针的链表最小子串覆盖
矩阵搜索二维矩阵旋转图像岛屿的个数螺旋矩阵
宽度优先搜索克隆图被围绕的区域拓扑排序单词接龙
链表实现一个链表的反转链表求和II删除链表中的元素LRU缓存策略合并两个排序链表两个链表的交叉翻转链表II复制带随机指针的链表带环链表
枚举法统计数字名人确认最长连续上升子序列最大子数组差最长公共前缀
排序快排摆动排序最大间距最接近零的子数组和最大数四数之和数组划分第K大元素排颜色
深度优先搜索N皇后问题图是否是树带重复元素的排列分割回文串
数组数组划分逆序对合并区间搜索旋转排序数组最大子数组删除排序数组中的重复数字第二大的数组先递增后递减数组中的最大值两数和-输入的数据是有序的两个排序数组的中位数在大数组中查找颜色分类合并排序数组无序数组K小元素中位数奇偶分割数组
贪心主元素寻找缺失的数买卖股票最佳时机加油站删除数字落单的数最大子数组差
线段树线段树查询线段树的构造线段树的修改区间求和统计比给定整数小的数的个数
栈带最小值操作的栈用栈实现队列有效的括号序列简化路径
整数反转整数将整数A转换为B整数排序
字符串处理罗马数字转整数回文数乱序字符串有效回文串翻转字符串最长无重复字符的子串字符串压缩比较字符串编辑距离II


■谢邀。对于这个问题,我也不太有发言权,只能根据自己的体会瞎说一下。不清楚lz的具体水平,所以中间提供了一些可供测试的内容。1、可以先不看任何书籍,自己试着解决一些简单问题。或是与他人讨论问题。2、等你习惯了使用位图、hash、优先队列来解决问题(这部分知识用到时从网上能搜索到)。可以开始学习动态规划和分治。3、如果你对递推已有所了解,并会运用到状态转移方程中。同时可以解决这里面的大部分问题:http://www.51nod.com/favorite/index.html#!favoriteId=25。那么你可以开始看《算法导论》了。4、算法导论的内容不需要通读,找自己懂的部分仔细看看,图论部分可以先略过。习题如有不懂无须深究,以后慢慢体会。最好将注意力集中在《算法导论》的问题上,不要被其他问题分散了精力。5、第1次看过导论之后,需要将学到的知识,以及分析问题的方法总结并灵活运用。这时你应当可以解决这里面的大部分问题。http://www.51nod.com/favorite/index.html#!favoriteId=36http://www.51nod.com/favorite/index.html#!favoriteId=266、到各个OJ挑一些水题做,同时别忘了同大家讨论,讨论是加深记忆的捷径。经过这段后,你应当可以轻松的解决这里面的大部分问题。http://www.51nod.com/favorite/index.html#!favoriteId=33http://www.51nod.com/favorite/index.html#!favoriteId=27如果《算法导论》算是教材的话,你目前虽未完全掌握教材中的内容,但应该已经了解了不少超纲的内容。7、第2次看《算法导论》,这次除了线性规划和近似算法可以跳过,剩下的知识点都要涉及。哪怕细节存疑,先掌握哪些问题用哪些方法解决。之后可以试着解决一下这些问题:http://www.51nod.com/favorite/index.html#!favoriteId=34http://www.51nod.com/favorite/index.html#!favoriteId=28到此知识的基础构架应当完备了,但各种模型转换以及思想的运用,还要靠长期的积累学习。
■不BB,直接上干货,非科班出生,毕业工作后才开始学算法,到目前学了4年!!!
为了让你对数据结构和算法能有个全面的认识,我画了一张图,里面几乎涵盖了所有数据结构和算法书籍中都会讲到的知识点。




这里面有10个数据结构:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie树;10个算法:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法。
掌握了这些基础的数据结构和算法,再学更加复杂的数据结构和算法,就会非常容易、非常快。
小技巧:看到一个好答案,想点赞又嫌麻烦,可以双击屏幕自动点,既能鼓舞作者,又能很方便自己下次再看。我用这个方法,已经快速标记10来个好答案了。
貌似手机端打开连接有的会出现问题,可以点击这个总结看看:
五分钟学算法:算法与数据结构文章详细分类与整理!-五分钟学算法1、复杂度分析看动画轻松理解时间复杂度(一)