算法
ASN_forever
这个作者很懒,什么都没留下…
展开
-
大数据相关算法面试题
摘自:https://www.cnblogs.com/simonote/articles/3087185.html转载 2018-11-21 13:54:21 · 259 阅读 · 0 评论 -
LeetCode783题:二叉搜索树结点最小距离
思路一:中序遍历然后循环比较这道题其实跟第530题是一样的。都是求二叉搜索树的任意两个结点之差的最小值。这时候关键要清楚二叉搜索树的原理,即当前节点大于其左子树小于其右子树。同时考虑到二叉搜索树的中序遍历实际上一个正序排序的过程,因此可以先对二叉搜索树中序遍历并保存到list中,然后循环比较前后两个元素之差找到最小差即可。public int minDiffInBST(TreeNod...原创 2018-12-22 17:18:18 · 353 阅读 · 0 评论 -
LeetCode938:二叉搜索树的范围和
思路一:中序遍历后遍历求和只要是关于二叉搜索树的问题,首先要想到二叉搜索树的特征以及中序遍历的特征。此题中的L和R指的是中序遍历排序后的前后两个结点。因此,要求L和R之间所有结点的值的和,就可以先中序遍历得到排序后的数组,然后遍历数组求和即可。 public int rangeSumBST(TreeNode root, int L, int R) { Array...原创 2018-12-22 21:35:39 · 652 阅读 · 0 评论 -
N级台阶,一次上1级或2级或3级或M级,总共有多少种走法
思路先分析最简单的,也就是每次要不上1级,要么上2级。这个问题需要反过来思考才能比较容易的找到规律。总共有N级台阶,因为每次要么上1级要么上2级,因此对于第N级台阶来说,它的前一步要么是在N-1级处要么是在N-2级处。在N-1级处时上1级到N级台阶,在N-2级处时上2级到N级台阶。因此,可以用公式表示为f(n)=f(n-1)+f(n-2),其中f(n)表示从第一级开始到第n级有多少种走法。...原创 2018-09-07 21:05:40 · 23263 阅读 · 3 评论 -
LeetCode257题:二叉树的所有路径
思路: 关键点是路径的定义,即根结点到叶子节点。而判断是否为叶子节点只需要判断其左右子结点是否都为空即可。递归实现,如果当前节点不为空就将其值val加入到stringbuffer中,并在此条件下判断它是否为叶子节点(即左右子节点都为空),如果是则将stringbuffer添加到list中,否则,如果有左子节点,则递归到左子节点,如果有右子节点,则递归到右子节点。需要注意的是,递归的时候...原创 2018-12-12 10:10:50 · 189 阅读 · 0 评论 -
LeetCode258题:各位相加——数字根
这道题涉及到数学领域的一个定理,即“数字根”。 解法一:笨方法(循环)public int addDigits(int num) { Integer res = new Integer(num); while(res>9){ String str = res.toString(); int ...原创 2018-12-12 10:47:48 · 383 阅读 · 0 评论 -
LeetCode263:丑数
解法一:循环法根据定义,丑数是质因数只包含2,3,5的数。意思如果一个正整数m存在i,j,k(i,j,k都是非负整数)使得m = 2*i+3*j+5*k,那么m就是一个丑数。所以只要依次尽可能的取模2,3,5,最后的余数如果是1,那么就是丑数了。(这个很简单,稍微想一下应该就知道原因了)public boolean isUgly(int num) { if(num =...原创 2018-12-12 13:22:00 · 286 阅读 · 0 评论 -
LeetCode198题:打家劫舍
思路:每个房子都有两种结果,要么被抢要么不被抢。因此要计算从1号到i号房子最多能抢多少现金,可以用下面的公式表示:rob(i) = Max("i被抢","i不被抢")。因此,对于i号房子,需要同时分析被抢和不被抢两种情况,比较获取最大值即可。i被抢如果第i个房子被抢,因为相邻的房子不能同时被抢,所以i-1不能被抢,能被抢的只能是i-2及之前的房子,因此,当第i个房子被抢时,可以...原创 2018-12-23 23:19:46 · 316 阅读 · 0 评论 -
LeetCode746题:使用最小花费爬楼梯
思路: 这题与LeetCode198题“打家劫舍”属于相同题型,都涉及到动态规划的思想。对于第i阶楼梯来说,有两种情况,要么走第i阶楼梯,要么直接跨过第i阶楼梯。而最终要求从1阶登过i阶的最小总花费cost(i)就可以用下面的公式表示:cost(i) = min(“走i阶时的最小总花费”,“跨过i阶时的最小总花费”) 接下来对这两种情况进行讨论。1)走i阶时的最小总花费...原创 2018-12-24 10:35:07 · 445 阅读 · 0 评论 -
LeetCode64题:最小路径和
思路: 题目要求的是从左上角即[0,0]位置开始,到右下角即[m-1,n-1]位置为止的最小路径和。倒过来思考的话,对于右下角[m-1,n-1]来说,它的上一步只有两个位置即[m-2,n-1]和[m-1,n-2],因此问题就可以转化为求从[0,0]到这两个位置的路径和的较小值,即状态转移公式为:min ( arr[m-1][n-1] ) = min ( arr[m-1][n-1]+min(...原创 2018-12-25 15:00:05 · 554 阅读 · 0 评论 -
LeetCode63题:不同路径2
思路:这道题与LeetCode62题几乎完全相同,只是在62题的基础上增加了“障碍”限制。因为只能向右和向下移动,那么容易想到,如果某一处[i,j]有障碍,那么它右侧的[i,j+1]位置只能经过[i-1,j+1]到达。因此[i,j+1]的值用[i-1,j+1]代替即可。如果一个位置[i,j]的上边和左边都是障碍的话,那么这个位置肯定不会被任何一个路径经过,因此可以认为是"隐形"障碍(第一行...原创 2019-01-04 23:57:14 · 350 阅读 · 0 评论 -
LeetCode378题:有序矩阵中第k小的元素
思路:首先分析已知条件,即数组是每行从左到右递增,每列从上到下递增的(非严格递增)。要找到第k小的元素,那么最笨的方法就是将数组所有元素升序排序后,取第k个元素;或者是用优先级队列的思想,始终维持已遍历元素中的k个最小元素,直到遍历结束,取队列的最后一个元素;或者用小顶堆的数据结构,遍历数组并构建堆,构建完成后,找到第k小的元素。解法一:排序(最笨的) public int kt...原创 2018-12-25 23:23:03 · 2427 阅读 · 0 评论 -
LeetCode235题:二叉搜索树的最近公共祖先
这道题要充分利用二叉搜索树的性质,即比某一节点大的数全在其右侧,比其小的数全在其左侧。思路:知道了二叉搜索树的性质后,根据其性质可知,如果p和q在节点temp的两侧的话,也就是当(p.val - temp.val)*(q.val - temp.val)<=0时(包含“=”号,因为“一个节点也可以是它自己的祖先”),则当前节点temp就是它们的最近公共祖先。否则说明p和q都在tem...原创 2018-12-11 16:37:46 · 652 阅读 · 0 评论 -
LeetCode106题:从中序与后序遍历序列构造二叉树
思路: 本题的思路与LeetCode105题:从前序与中序遍历序列构造二叉树的思路非常类似。只不过这里要根据后序遍历序列遍历当前节点而已。class Solution { public TreeNode buildTree(int[] inorder, int[] postorder) { return helpBuild(inorder,postorder,...原创 2018-12-21 22:23:49 · 285 阅读 · 0 评论 -
LeetCode105题:从前序和中序遍历序列构造二叉树
思路: 首先要清楚二叉树的前序遍历和中序遍历的过程。所谓的前序遍历,其遍历顺序为:当前节点-->左子树-->右子树;而中序遍历的遍历顺序为:左子树-->当前节点-->右子树。因此,中序遍历序列中某一节点的左右两侧则分别为其左右子树。这样思路就出来了,先在前序遍历序列中设定当前节点,然后在中序遍历序列中遍历找到当前节点,然后对其左右子树(即左右两侧的局部序列)分别进行...原创 2018-12-21 21:09:42 · 521 阅读 · 0 评论 -
LeetCode求最长回文子字符串
回文:正序和倒序一样的字符串,如“abccba”,“abcba”。方法一:暴力搜索public static String longestPalindrome(String s) { int len = s.length(); if(len == 1){ return s; } int max = 0...原创 2018-11-26 22:02:26 · 258 阅读 · 0 评论 -
LeetCode283题:移动零
解法一:双重循环 ( 最笨的,时间O(N2),空间O(N) )public void moveZeroes(int[] nums) { int len = nums.length; for (int i = 0; i < len; i++) { if (nums[i] == 0) { for (int j = i + 1; j < len; j++) ...原创 2018-12-12 16:00:56 · 318 阅读 · 0 评论 -
leetcode108题:将有序数组转换为二叉搜索树
题目要求的是高度平衡的二叉搜索树,故每个节点应该取所在区间的中间节点。就跟二分查找一样。首先用整个数字的中间位置(下标基座mid)的数生成根结点root,然后找mid左边即0到mid-1的中间位置的元素生成root的左子节点,mid右边的即mid+1到len中间的生成root的右子节点,并在每一次区中间元素时修改区间范围。以此类推,递归即可。class Solution { pub...原创 2018-12-05 23:09:57 · 261 阅读 · 0 评论 -
LeetCode303题:区域和检索——数组不可变
常规思路:这道题说白了就是要你写一个函数,这个函数有两个int型的形参i和j,分别表示数组的两个下标,然后需要返回这两个下标及其之间的所有数的和。如果只考虑单次调用的需求的话,直接从i到j累加就完了。但说明中提到,函数会被多次调用。那么如果每次调用都从i到j累加一遍的话,之前累加的结果就浪费了,相同的i和j每次都会做重复的累加,效率就会很低了。因此需要换一种思路。非常规解法:初始化数组...原创 2018-12-12 22:18:43 · 298 阅读 · 0 评论 -
LeetCode169:求众数之摩尔投票法
这道题目对众数有了自己的定义,即出现次数大于n/2的元素,而不是出现次数最多的元素。下面这个方法,要求数组中必须有一个元素出现的次数大于等于n/2(前提条件),不然求出的结果不一定是众数。public int majorityElement(int[] nums) { int temp=nums[0]; int count=1; for(int...原创 2018-12-06 13:14:45 · 522 阅读 · 0 评论 -
LeetCode367题:有效的完全平方数
这道题就是让你写一个函数用来判断一个是num是否为某个数m的平方的。解法一:暴力搜索法判断一个数是不是某个数的平方,暴力一点的想法,就是从i = 1开始循环,如果i*i小于num,则i++;如果等于num,则返回true;如果大于num,则返回false。public static boolean isPerfectSquare(int num) { if(num...原创 2018-12-13 14:21:22 · 679 阅读 · 2 评论 -
java实现递归全排列算法
思路: ①找到所有可能出现在第一个位置的字符,即start与其后面所有与它不同的字符互换位置 ②一个位置的字符完成步骤①之后,递归进行下一个位置的互换操作,也就是start+1 ③直到start==end,说明最后一个字符以及互换完毕,所以打印第一轮的互换结果,然后返回到上一个位置的for循环中 ④再次进行swap操作...原创 2018-12-04 09:55:47 · 2084 阅读 · 1 评论 -
LeetCode102:二叉树的层次遍历
思路:用一个队列和列表来实现。主要是两层循环,外层循环用来获取队列大小size以及初始化一个列表list(用来存储当前层的节点),内层循环用来依次从队列中从左到右的取出当前层节点放到list中,并将当前节点的左右子结点插入到队尾。每次从队列中取出一个节点的时候都要对size进行自减操作,直到当size==0时,也就是当前层所有的节点都从队列中取出后,再重新开始外层循环,计算下一层的结点数si...原创 2018-12-07 09:51:23 · 198 阅读 · 0 评论 -
全排列的java递归实现
思路:全排列,对于数组来说,就是某一个下标处可以放整个数组所有的元素。因此每个位置的元素都用其后的各个元素依次与其进行互换,直到需要互换的是最后一个元素时,打印出来的结果就是某一种全排列,然后返回到上一个元素。返回时要注意需要再互换一次回复到原来的状态。后来发现,原来以前写过全排列:https://blog.csdn.net/ASN_forever/article/details/847834...原创 2018-12-14 18:11:44 · 814 阅读 · 0 评论 -
LeetCode438题:找到字符串中所有字母异位词
原始思路1: 获取p串的全排列,与s暴力对比但这种方法时间复杂度太高,主要是因为全排列的复杂度太高,如果p字符串长度为n的话,那么全排列复杂度为O(n!)。严重超时。public class Test { Set<String> set = new HashSet<String>(); public static void main(String[] ...原创 2018-12-15 13:31:30 · 589 阅读 · 0 评论 -
LeetCode204题:计数质数
这道题真的是解法很多,但满足时间复杂度的还不太容易想。解法一:暴力法外层循环从2到n,内层循环从2到ni,然后ni取模内层循环的值,判断是否为质数。复杂度O(n2),舍弃。解法二:根据之前的质数求思路:一个数如果与比它小的所有的质数取模后结果都不为0时,那么此数也是质数。所以,从2开始遍历到n时,每遇到一个质数就将其放到ArrayList中(用ArrayList而不用trees...原创 2018-12-10 23:36:22 · 408 阅读 · 0 评论 -
LeetCode96题:不同的二叉搜索树
思路:一般来说,只要涉及到二叉树或二叉搜索树的,基本都要用到根结点和递归的思想。对于本题来说,假设要求的结果为f(n),那么开始分析:由1到n节点组成的二叉搜索树的根结点总共有n种取值情况,即1,2...n分别作为根结点,当1作为根结点时,其左子树为空记为f(0),右子树为2到n总共n-1个节点组成的二叉搜索树,且这n-1个节点总共有f(n-1)种组成情况,因此,以1为根结点时,总共有f(...原创 2019-01-07 16:55:13 · 262 阅读 · 0 评论