前言
前段时间面试百度 Java 技术岗时碰到了一道算法题:任意数分三组,使得每组的和尽量相等。因为工夫仓促,加之面试时头昏脑涨,这道题没做进去甚至没有给出思路,导致百度面试之旅失败。这让我多少有些遗憾和不甘。因为最近接触算法的货色较多而且自身对算法感兴趣,所以回家之后搜索枯肠想把这题做进去。
说说我的思路:首先肯定要先排序,这也是解决问题的要害。而后降序排序后的前三个数各分一组把残余数往三个数上叠加。我最开始的思路也是如此,问题在于分组个数不确定,呈现极其大的数怎么办,怎么叠加?那层窗户纸就是将残余数中的最大值加到前三个数的最小值上,而后重排序,持续叠加,直到数组个数剩三个为止!(不晓得大家能不能看懂)我预先解题思路大抵就是这样,太苦逼了。
还记得我当初校招的时候第一场面试也是倒在算法,算法能够说是咱们每个程序员的痛,明明平时工作的时候不会太多用到,但这个却是面试必问的点,也是咱们进阶必须要面对的货色。当初算法挺吃香的,但咱们也不可能全身心的投入到算法的学习,这时候就须要一本好的参考书来帮助咱们学习。上面要与大家介绍的文档能够作为从事计算机钻研与开发的技术人员的参考书,特地是 对正在筹备面试、加入选拔性考试以及校园面试的读者尤为有用。
这份文档以 Java 为描述语言,介绍了计算机编程中应用的数据结构和算法。这份文档强调问题及其剖析,而非实践论述,共分为 21 章,讲述了基本概念、递归和回溯、链表、栈、队列、树、优先队列和队、并查集 DAT、图算法、排序、查找、抉择算法(中位数)、符号表、散列、字符串算法、算法设计技术、贪心算法、分治算法、动静布局算法、复杂度类型等内容。每章首先论述必要的实践根底,而后给出问题集。文档中大概有 700 个算法问题及相应的解法,对于许多问题,文档中提供了多个具备不同复杂度的解决办法。因为篇幅限度无奈全副展现进去,须要的敌人 看我主页简介 即可!
字节外部算法文档
第 1 章绪论
本章的目标是论述算法剖析的重要性、它们的表示法和关系,并尽可能求解多个问题。首先,让咱们重点关注算法的基本要素、剖析的重要性,而后再逐渐探讨上述提及的其余主题。在实现本章的学习后,可能剖析任意给定算法的复杂度(特地是递归函数)。
第 2 章递归和回溯
本章将探讨一个重要的内容“递归”。本书中简直每章都要用到递归,同时还介绍一个与之相干的概念“回潮”。
第 3 章链表
第 4 章栈
第 5 章队列
第 6 章树
第 7 章优先队列和 堆
第 8 章并查集 ADT
本章将介绍一种十分重要的数学概念; 汇合。它阐明如何示意一组无需思考程序的元素。并查集 ADT 能够示意一组无序元素,可用来解决等价问题。并查集易于实现,应用一个简略数组就能实现它,且每个函数也只需几行代码。在许多算法中,并查集 ADT 是作为一个辅助数据结构而存在的(例如,图论中的 Kruscal 算法)。在探讨并查集 ADT 前,首先理解汇合的几个根本性质。
第 9 章图算法
在事实世界中,许多问题是由对象以及它们之间的分割所形容的。例如,在航空地图中,咱们可能对这样的问题感兴趣:“从海德拉巴去纽约,哪种形式最快?”或者“哪种形式价格最便宜?”为了答复这些问题,须要对于对象 (城镇) 之间的分割 (航行路线) 信息。图就是用来解决这类问题的数据结构。
第 10 章排序
第 11 章查找
第 12 章抉择算法(中位数)
第 13 章符号表
第 14 章散列
第 15 章字符串算法
为了了解字符串算法的重要性,思考在任意一个浏览器 (如 InternetExplorer、Fire-fox 或 Google Chrome) 中输出一个 URL(Uniform Resource Locator,对立资源定位符)时产生的状况。在键入 URL 的一些前缀字符后,能够看见浏览器会显示一个所有可能的 URL. 列表。这意味着,浏览器执行了一些外部解决后,给用户一个可能匹配的 URL 列表。这种技术常称为主动实现。
第 16 章算法设计技术
后面的章节针对不同的问题介绍了各种算法。在求解一个新问题时,通常的思路是寻找以后问题与已解决问题之间的相似之处,从面轻松找到新问题的求解办法。本章将对各种算法依照不同的办法进行分类,而后在随后的 3 章中别离介绍 3 个算法设计思维〔即贫婪、分治和动静布局〕.
第 17 章贪心算法
首先通过对一个简略实践的探讨,初步了解贪心思维。以下棋为例,每一步的决策都须要思考对后续棋局的影响。而在网球 (或排球) 较量中,选手的行为仅取决于以后的情况,抉择当下最为正确的动作,而不关怀后续的影响。这阐明在某些状况下抉择当下最佳行为的决策,能够失去一个最优解(贪心),但并非所有状况都如此,贪心策略实用于上述第二类问题。
第 18 章分治算法
第 18 章 分治算法
对于第 17 章列举的许多问题,贪心策略不能提供最优解。而其中的某些问题可通过分支 (Divid and Conquer,D&C) 法来轻松求解。分治法是一种重要的基于递归的算法设计技术,分治算法递归地将问题合成为两个或多个同类型的子问题,直至这些子问题简略到可能间接求解,而后再将这些子同题的解合成为原始问题的解。
第 19 章动静布局算法
本章将试图求解那些采纳其余技术 (如分治法和贪心法) 无奈取得最优解的问题。动静布局 (Dynamic Programming,DP) 是一项虽简略但较难把握的技术。一个容易辨认和求解 DP 问题的办法是通过求解尽可能多的问题。“Programming”一词并不是指编程,二是示意填充表格(相似于线性规划)
第 20 章复杂度类型
在后面的各章中,形容了不同问题求解的复杂度。某些算法随着问题规模的减少其复杂度的增长速率较低,而另一些则有比拟高的增长速率。对于具备较低增长率的问题,称为简略问题 (或易求解问题); 对于具备较高复杂度的问题,称为难问题(或难求解问题)。该分类是基于求解某个问题时算法的运行工夫(或者占用内存) 决定的。
第 21 章杂谈
本章将介绍一些对于面试和考试有用的话题,咱们来看看文中的一些其余的编程题。
- 设计一个算法,依照螺旋程序顺次输入矩阵中的元素。
- 设计一个洗牌算法。
- 基于反转算法的数组旋转问题。设计一个函数 rotate(A[],d,n),该函数将大小为 n 的数组旋转 d 个元素。例如,数组 1,2,3,4,5,6,7 在通过 2 个元素的旋转后变为 3,4,5,6,7,1,2。
- 已知数组 s[1..n]和反转函数(s,i,j),反转函数颠倒à到 j 之间的数组元素(包含第 i 和 j 个元素)的程序。以下序列的性能是什么?(1<kn)
- 字符串由词和空格组成,设计一个程序将字符串中所有空格移到字符串的最后面,要求仅遍历数组一次,并且在原字符串中进行调整。
- 是否升高问题 5 算法的复杂度?
- 对于一个蕴含词和空格的字符串,设计一个程序将所有空格移到字符串的开端,要求仅遍历数组一次,并且在原字符串中进行调整。
- 挪动 0 到开端。给定由 n 个整数组成的数组,将数组中的 0 挪动到开端。例如,如果有数组{1,9,8,4,0,0,2,7,0,6,0},应该变为{1,9,8,4,2,7,6,0,0,0}。所有其余元素的程序不变。
- 是否升高问题 8 算法的复杂度?
- 问题 9 的变型。已知一个蕴含负数和正数的数组,设计一个算法将负数和正数离开,要求负数和正数的绝对程序放弃不变。输人: 一 5,3,2,一 l,4,一 8,输入: 一 5,—1,—8,3,4,2。
这些问题你能答出多少?(手动狗头)反正我一时半会搞不定。不过没关系文档中也是有着每一题的解析,最初咱们来看一看一位大佬对算法的一些认识。
大佬的一些认识
PS:我国软件学习形式主义太过重大,算法这种货色必须要与实际相结合能力真正起到作用,很多程序员算法十分厉害可是就是做不出货色,为啥,因为他们并不能能深刻理解算法,很多状况就是机械性套用算法,而且算法这种货色必须要与编程技术相结合,繁多的算法简直难以解决问题,比方云计算就属于算法,与互联网技术,多线程技术,多过程技术,和各种软硬件技术结合体,繁多从一个层面去看算法简直解决不了任何问题,国外的顶级软件巨匠则是将算法转化为计算机能够辨认算法,并联合于其余计算机技术,使其达到最大效力,例如深度学习就和 cuda 相结合,使其最好的运行在某些硬件之上,再加之 cuda 具备极强并行运算能力,其效力达到最大化,其实算法与计算机技术具备极大跨度须要那种对数学或其余学科与计算机都较为精通的人才能正真转化,否则单—算法工程也仅仅只是书呆子的模式。难成小事。
我感觉他字多他说的都对,言归正传如果有敌人须要算法文档,看我主页简介即可~