算法
刘裕育
这个作者很懒,什么都没留下…
展开
-
算法题十七 之 寻找循环递增数组的最小值
给一个循环递增数组,用最快的方式寻找出最小值例如:9,10,50,66,70,80,200,2000,-1,0,2,3,4,8 返回 -1。用二分法,只是二分的条件比较复杂,时间太紧,一开始想不出来这么优雅的代码,只是胡乱的二分。下面是我现在写出来的我认为比较好的代码 private int find(int[] arr) { if (arr == null) { return -1; } if (arr.length == 1) { return arr[0]; }原创 2021-09-28 10:44:23 · 551 阅读 · 0 评论 -
算法题十六 之 二叉树根节点到叶子节点的所有路径和
二叉树根节点到叶子节点的所有路径和题目:给定一个仅包含数字 0−9 的二叉树,每一条从根节点到叶子节点的路径都可以用一个数字表示。例如根节点到叶子节点的一条路径是1→2→3,那么这条路径就用 123 来代替。找出根节点到叶子节点的所有路径表示的数字之和例如:这颗二叉树一共有两条路径,根节点到叶子节点的路径 1→2 用数字 12 代替根节点到叶子节点的路径 1→3 用数字 13 代替所以答案为 12+13=25思路这道题很简单,只是我一开始思路想错了,并且在线上环境,不可以用IDEA,原创 2021-07-05 22:46:42 · 406 阅读 · 2 评论 -
算法题十五 之 重构字符串
题目给定一个字符串S,检查是否能重新排布其中的字母,使得两相邻的字符不同。若可行,输出任意可行的结果。若不可行,返回空字符串。注:S 只包含小写字母并且长度在[1, 500]区间内。例如:输入: S = “aab”输出: “aba”输入: S = “aaab”输出: “”思路一、像字符串的这种题,一般而言需要“桶的思想”。我们可以把26个小写字母,看成26个桶,每一个桶存着具体字母的大小。二、我们优先处理最大的那个桶,把这个桶的字符串与第二大桶的字符串互相消费。每一次消费都需要更新最大原创 2020-11-30 17:09:41 · 173 阅读 · 0 评论 -
算法题十四 之 判断是否是平衡二叉树
题目给你一个树,判断是否是平衡二叉树。平衡二叉树的定义:左右子树的高度相差不大于1思路很简单,我们只需要判断如下两点:递归调用判断左右子树的高度是否大于1,如果大于1,则不是平衡二叉树。满足第一点的同时,还需要判断左右子树是否同时也是平衡二叉树。很简单的一道题,理解树的遍历其实就很容易解决这样的题目了附上代码public boolean isBalanced(TreeNode root) { if(root == null){ return true;原创 2020-09-10 16:32:57 · 275 阅读 · 1 评论 -
算法题十三 之 图像渲染
题目leetcode 传送门我发现,原题描述很让人迷惑,把一道简简单单的题目故意说得很复杂。简单翻译一下有一个矩阵,宽高是 n 与 m这个矩阵里有颜色值,有一个数字表示现在给你一个点(sr,sc)和一个新的颜色值,让你把这个矩阵与点(sr,sc)直接与间接相连格子染成新的颜色值。判断相连的方式是 上 下 左 右思路从起点(sr,sc)开始深度遍历每次对比上下左右的颜色值是否与当前点一致如果一致,则递归调用如果不一致,则停止。附上代码public int[][] flood原创 2020-09-08 18:47:49 · 250 阅读 · 0 评论 -
算法题十二 之 有效的括号
题目给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。思路这道题目应该是应届生水平题目,我记得在大一时学习数据结构的时候,老师出过这样的题目,当年真的一脸懵逼,现在做起这样的题目,就很轻松了。本质是利用栈的先进后出的原理①,当遇到左括号时,都入栈。②,遇到右括号时,先判断栈是否为null,如果是null,说明当前右括号没有左括原创 2020-09-08 16:55:40 · 97 阅读 · 0 评论 -
算法题十一 之 两数相乘
题目给定两个只包含0 - 9 的字符串,输出两个字符串相乘的结果。要求:不可以直接把输入的字符串转化成整数思路因为不可以直接把输入字符串转化成正数,所以我们只能用代码实现一个位一位之间的相乘。每一个位相乘之后,把所有结果加起来,即是答案。根据第二点,我们还需要实现两数相加,因为虽然题目只是要求不可以把输入字符串直接转化正数,但是乘出来数字有可能非常的大,用基本数据类型可能也没有办法存。先实现两个数相加思路: 这其实是另外一道题目了,思路是从每个字符串的最高位开始,两两相加,然后 %原创 2020-09-08 16:32:24 · 854 阅读 · 0 评论 -
算法题 十 之 无向连接图的深度拷贝
题目无向连接图的深度拷贝图的表示方式,用数组表示与当前节点连接的节点,如下面的代码class Node { public int val; public List<Node> neighbors;}思路对于图片的拷贝,需要先掌握图的遍历,图的遍历可以使用深度与广度优先遍历。在这个题目里,我们采用深度优先遍历来解题。深度优先遍历递归调用各个节点。遍历的出口?我们在遍历循环图的时候,是采用标志位当前节点是否已经遍历过了,如果遍历过了就不再遍历,避免重复以及死循环原创 2020-09-08 15:32:07 · 663 阅读 · 0 评论 -
算法题九 之 被围绕的区域
题目给定一个二维的矩阵,包含 ‘X’ 和 ‘O’(字母 O)。找到所有被 ‘X’ 围绕的区域,并将这些区域里所有的 ‘O’ 用 ‘X’ 填充。例如:X X X XX O O XX X O XX O X X输出:X X X XX X X XX X X XX O X X思路第一步:从题目的观察中可以得知,只要O与边界连接,这个O便不被包围。而与O这个连接的所有O,也都不被包围。第二步:根据第一步的观察,只要O通过连接链与边界产生关系,则当前O是不被包围,反之,则被包围。第三步:原创 2020-09-08 14:56:52 · 507 阅读 · 0 评论 -
算法题 八 之 腾讯笔试题 之 画家小Q
画家小Q画家小Q又开始他的艺术创作。小Q拿出了一块有NxM像素格的画板, 画板初始状态是空白的,用’X’表示。小Q有他独特的绘画技巧,每次小Q会选择一条斜线, 如果斜线的方向形如’/’,即斜率为1,小Q会选择这条斜线中的一段格子,都涂画为蓝色,用’B’表示;如果对角线的方向形如’’,即斜率为-1,小Q会选择这条斜线中的一段格子,都涂画为黄色,用’Y’表示。如果一个格子既被蓝色涂画过又被黄色涂画过,那么这个格子就会变成绿色,用’G’表示。小Q已经有想画出的作品的样子, 请你帮他计算一下他最少需要多少次原创 2020-09-03 10:59:11 · 389 阅读 · 0 评论 -
算法题 七 之 IP地址复原
题目给一个只包含数字的字符串,还原所有IP地址的可能性,IP地址的每个小段用“.”分开,每个小段除了0之外,其他不能以0开头,每个小段的不可以超过255。例如:输入:s = “25525511135”输出:[“255.255.11.135”,“255.255.111.35”]很简单的一道题目,很明显用 “递归” + “回溯” 算法即可解决。 递归的状态定义一个下标 index:表示在字符串里位置。定义一个临时数组,代表着当前的临时结果。每次进去递归窗口。需要做如下几个处理。第一:递归的出口,判原创 2020-08-25 10:49:23 · 362 阅读 · 0 评论 -
算法题 六 之 校验二叉树
题目:给定两颗二叉树,校验二颗二叉树是否一致。当二叉树的结构和每个节点的值都为一样时判定为一致。很简单的一道题,递归调用即可。附上代码;public boolean isSameTree(TreeNode p, TreeNode q) { // 判断结构 if(p == null && q == null){ return true; } if(p == null || q == null){ return false;原创 2020-08-24 20:32:25 · 118 阅读 · 0 评论 -
算法题 五 之 二叉树的最大权值
题目:一个二叉树,每个节点上都有权值,当父节点和子节点不能同时选中的前提下,二叉树的最大值。实例请看 :https://leetcode-cn.com/problems/house-robber-iii/解析:每个节点有两种状态,一种是选中当前节点的情况下,当前节点从下往上的最大权值。一种是没有选中当前节点的情况,当前节点从下往上的最大权值。所以 定义两个哈希表,一个存选中的情况的每个节点的最大值,一个存没选中情况下的每个节点的最大值。当节点是叶子节点时,选中情况下的最大值即本身。不选中情况下的最原创 2020-08-24 20:14:54 · 2320 阅读 · 0 评论 -
算法题 四 之 图的是否有环
课程表 II现在你总共有 n 门课需要选,记为 0 到 n-1。在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1]给定课程总量以及它们的先决条件,返回你为了学完所有课程所安排的学习顺序。可能会有多个正确的顺序,你只要返回一种就可以了。如果不可能完成所有课程,返回一个空数组例如:输入: 4, [[1,0],[2,0],[3,1],[3,2]]输出: [0,1,2,3] or [0,2,1,3]解释: 总共有 4 门课程原创 2020-08-14 11:36:33 · 145 阅读 · 0 评论 -
算法题 三 之 二叉树展开为链表
二叉树展开为链表题目:给定一个二叉树,原地将它展开为一个由右子树连接的单链表。leetcode 传送门思路:定义一个方法,传入当前节点与上一个需要被连接的节点。返回值是此节点以及所有子树处理完毕后的最后一个节点。递归调用即可。(要注意先处理左子节点,然后提前存好右子节点)附上代码public void flatten(TreeNode root) { if(root == null){ return; } TreeNode lastNode = root;原创 2020-08-04 17:14:17 · 124 阅读 · 0 评论 -
算法题 二 之 最小区间
最小区间题目:你有 k 个升序排列的整数列表。找到一个最小区间,使得 k 个列表中的每个列表至少有一个数包含在其中。我们定义如果 b-a < d-c 或者在 b-a == d-c 时 a < c,则区间 [a,b] 比 [c,d] 小。例如:输入:[[4,10,15,24,26], [0,9,12,20], [5,18,22,30]]输出:[20,24]解释:列表 1:[4, 10, 15, 24, 26],24 在区间 [20,24] 中。列表 2:[0, 9, 12, 20]原创 2020-08-04 16:36:14 · 622 阅读 · 0 评论 -
算法题 一 之 整数拆分
整数拆分给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。例如:输入10,输出36。10 可以 拆分成3 3 4,3 * 3 * 4 = 36。解法:这道题有很多子问题的解可以重复使用,所以采用动态规划的思想来接。public int integerBreak(int n) { // 动态规划 dp[i]:当处于i时,拆分了至少两个以上的最大乘积 // 第一步:定义 i ,i代表 2 .... n 的循环,所以原创 2020-08-03 10:05:57 · 785 阅读 · 0 评论 -
Android 源码分析之——Activity启动流程
Activity启动流程跟踪原创 2017-10-15 15:20:04 · 284 阅读 · 0 评论 -
八大排序实现与简单解析
在平时的开发过程中,需要用到排序的时候,都是调用java已经自带的接口。简单,高效和稳定,所以,我在这之前,都不懂得八大排序是哪八大排序。参加校园招聘后,才发现,排序的方面考得很多,于是又了这篇文章,算是一个学习记录。1、快速排序顾名思义,快速排序是快速的,它的时间复杂度是O(nlgn),速度那是相当的快。同时,快速排序所占用空间也很小,所以快速排序是又快同时占用的内存又少,所以是应用最广的一种排序原创 2017-09-03 10:41:29 · 330 阅读 · 0 评论 -
2018美团点评编程题第一题
晚上参加美团的笔试,今天从坐了一天的车,到了学校匆忙吃了饭,然后就开始了。确实是,脑子有点不灵光。编程的第一题: 给定一个序列,输出这个序列子串的和为K的倍数的子串的长度,如果有重复,输出最大长度。 例如:序列为:{1,2,3,4,5} k = 5 那么子串的和为5的倍数的有{2,3},{1,2,3,4},{1,2,3,4,5},{5} ,而这时长度最大的是5,所以输出5。刚开始看到这道题,原创 2017-09-01 00:20:43 · 2284 阅读 · 3 评论 -
一些往年校招题目
在学校的日子也只剩下一个多月,这几天一直在和朋友聚会,玩耍,差点忘记了今天有博客需要写。上次我说,找十道校招编程题,这两个星期做了有十几道,有一些没有记录一下。也参与好几个校招的笔试,Ac了一些,题目也没有记下来。 所以,只能选取五道我还记得并且有一些些难度的题目。1、格子距离地址:http://exercise.acmcoder.com/online/online_judge_ques?ques原创 2017-09-17 21:42:10 · 857 阅读 · 0 评论