自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(20)
  • 收藏
  • 关注

原创 LeetCode:填充树的右侧节点

题目:给定一个二叉树struct Node { int val; Node *left; Node *right; Node *next;}填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。初始状态下,所有next 指针都被设置为 NULL。进阶:你只能使用常量级额外空间。使用递归解题也符合要求,本题中递归程序占用的栈空间不算做额外的空间复杂度。来源:力扣(LeetCode)解:...

2020-09-28 20:27:48 149

原创 LeetCode:三数之和

题目:给你一个包含 n 个整数的数组nums,判断nums中是否存在三个元素 a,b,c ,使得a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。注意:答案中不可以包含重复的三元组。来源:力扣(LeetCode)解:这道题最简单的做法就是暴力破解,即a,b,c一层一层循环,然后去重复即可。但是时间复杂度太高,O(n^3),而且去重复麻烦,因为没什么规律,显然是个比较低效的算法。我们可以这样设计:先把数组排序,这样我们在遍历时快速去重复,可以减少遍历的次数,如...

2020-09-25 20:50:33 149

原创 LeetCode:盛最多水的容器

+盛水最多的容器给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点(i,ai) 。在坐标内画 n 条垂直线,垂直线 i的两个端点分别为(i,ai) 和 (i, 0)。找出其中的两条线,使得它们与x轴共同构成的容器可以容纳最多的水。说明:你不能倾斜容器,且n的值至少为 2。来源:力扣(LeetCode)解:这道题速度最快使用双指针法,即用head和tail指向数组头尾,然后获得当前面积值 Math.min(height[head],height[ta...

2020-09-24 00:12:50 82

原创 字节跳动:将数字字符串转换成IP地址

题目描述现在有一个只包含数字的字符串,将该字符串转化成IP地址的形式,返回所有可能的情况。例如:给出的字符串为"25525511135",返回["255.255.11.135", "255.255.111.35"]. (顺序没有关系)解:这道题采用的是回溯,我们递归查找,获得结果后返回进行下一个分支查找。子结构:插入“.”,如果还未满足3个点。判断是否为IP地址:是否“.*.”的 * 满足<255(这里不需要考虑>0,因为字符串不带-),同时不能存在“ 0...

2020-09-20 23:33:42 1262

原创 字节跳动:寻找二叉树两节点的最近祖节点

题目描述给定一棵二叉树以及这棵树上的两个节点 o1和o2,请找到 o1和o2的最近公共祖先节点。解:这道题可以采用递归查找+标记法求解,先找到两个节点的位置并用栈保存路径,(因为没有父节点指向没办法回滚)。然后对路径进行重合检查即可。这道题有点特殊,返回值只能是int,也就是说不存在找不到的情况。所以边界检查可做可不做。import java.util.*;/* * public class TreeNode { * int val = 0; * TreeN...

2020-09-19 21:49:16 269

原创 网易:矩阵最小权值路径和

题目描述给定一个由非负整数填充的m x n的二维数组,现在要从二维数组的左上角走到右下角,请找出路径上的所有数字之和最小的路径。注意:你每次只能向下或向右移动。解:很经典的DP题了,记得shopee也考过类似的,这道题递归+数组标记也能做的。每一个作为终点的话,就是上方或左方的值加上本身的值,哪个小取哪个。DP子结构:result[i][j] = min(result[i-1][j], result[i][j-1]) + value[i][j];注意初始化,0行和0列是由前一个值直接累

2020-09-14 21:53:27 284

原创 字节跳动:矩阵顺时针旋转

题目描述有一个NxN整数矩阵,请编写一个算法,将矩阵顺时针旋转90度。给定一个NxN的矩阵,和矩阵的阶数N,请返回旋转后的NxN矩阵,保证N小于等于300。测试样例:[[1,2,3],[4,5,6],[7,8,9]],3返回:[[7,4,1],[8,5,2],[9,6,3]]解:这道题其实没什么难度,主要是分得清旋转后的样子。其实就是每一行旋转90度后变成了列,而且是i行变在了(n-i-1)列,从0算起的话。import java.util.*;public cla

2020-09-14 21:33:29 210 1

原创 猿辅导:最长的子括号字符串

题目描述给出一个仅包含字符'('和')'的字符串,计算最长的格式正确的括号子串的长度。对于字符串"(()"来说,最长的格式正确的子串是"()",长度为2.再举一个例子:对于字符串")()())",来说,最长的格式正确的子串是"()()",长度为4.解:这道题显然用DP,子结构:i节点为结尾的最长字符串=i-k最长+2或=0。这里难点就出来了,因为前一个如果错误序列,那么就只能为0,但是有可能i-1错误,i匹配正确,所以这道题显然只有i-1是不能满足的。我们使用一个栈来帮助我们判断是否

2020-09-13 23:54:14 345

原创 较:二叉树的最大路径和

题目描述给定一个二叉树,请计算节点值之和最大的路径的节点值之和是多少。这个路径的开始节点和结束节点可以是二叉树中的任意节点例如:给出以下的二叉树,返回的结果为6解:注意,这道题的节点值可以是负的,所以如果我们是数组的话直接就用DP表做了。但是这道题是树结构,而且路劲无限制,所以子结构处理上会麻烦一点,可能也就是为什么这道题是快手笔试里算是有点难度的题。子结构推导:每条路径都是以某个节点作为根节点(子树任意)的一条路径,找到节点作为根节点的路径最大值,即子树(可不加子树,即为0)最大.

2020-09-10 18:27:05 242 1

原创 百度:最大正方形

题目描述给定一个由0和1组成的2维矩阵,返回该矩阵中最大的由1组成的正方形的面积示例1输入[[1,0,1,0,0],[1,0,1,1,1],[1,1,1,1,1],[1,0,0,1,0]]输出4解:这道题显然有明显的子结构,每一个正方形都由前一个(对角线)正方形叠加二来,所以我们可以建立DP关系 a[i][j] = max( a[i-1][j-1]+1 , someOf(a[i-1][j-1])+1 , 0) ,这里特别注意,包含关系可能是全包含,也可能是半包含。i

2020-09-09 22:07:04 169

原创 简:二叉树分支求和

题目描述给定一个二叉树和一个值\ sumsum,判断是否有从根节点到叶子节点的节点值之和等于\ sumsum的路径,例如:给出如下的二叉树,\ sum=22sum=22,返回true,因为存在一条路径5\to 4\to 11\to 25→4→11→2的节点值之和为 22解:这道题主要考察二叉树的深度遍历,这道题要避免多余的查找,一旦找到符合的就直接返回结束递归。import java.util.*;/* * public class TreeNode { * i...

2020-09-09 21:24:10 778

原创 中:二叉树的三序遍历

题目描述分别按照二叉树先序,中序和后序打印所有的节点。解:这道题倒是没什么难度,主要是动态数组的使用。如果不允许使用动态数组,那么也可以提前遍历一遍确定树节点总数,然后就可以用int[ ]来存储。如果不先遍历,而开足够空间的话,比较浪费内存,因为不确定n到底有多大只能往大了开,最后还得copy。import java.util.*;/* * public class TreeNode { * int val = 0; * TreeNode left = null; *

2020-09-08 16:57:48 158

原创 字节跳动:二叉树层次换序遍历

题目描述给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替)例如:给定的二叉树是{3,9,20,#,#,15,7},该二叉树之字形层序遍历的结果是[[3],[20,9],[15,7]]解:顺便提一下,二叉树的层次遍历一般借助队列。这里显然是反序的,一层换一次遍历序,那么我们可以用栈来做。两个栈,一个空,一个存当前层次,每次先按序遍历,然后子节点压入另一个栈,这样下次从另一个栈弹出时就能够形成反序遍历。注意顺序不要弄错了,.

2020-09-07 21:13:09 159

原创 字节跳动:非重复子数组最大长度

题目描述给定一个数组arr,返回arr的最长无的重复子串的长度(无重复指的是所有数字都不相同)。解:这道题主要是对非重复子数组的利用,也可以认为是DP变化。我们存下 i 位置的最大值,同时把遍历过的非重复子数组存入HashSet,下次就可以直接从最大值位置接着查询而不用从头(i位置)遍历。遍历点 i 可以作为终点,也可以作为起点,这里选用起点方式。import java.util.*;public class Solution { /** * * @para

2020-09-05 17:53:49 375

原创 简:有序链表合并

题目描述将两个有序的链表合并为一个新链表,要求新的链表是通过拼接两个链表的节点来生成的。解:这道题大概很多初学者学链表时都会做过吧,居然出现在字节跳动的笔试题里,也是出乎意料了。这道题一般都用选择排序,重组链表即可。import java.util.*;/* * public class ListNode { * int val; * ListNode next = null; * } */public class Solution { /**

2020-09-05 17:04:55 187

原创 中:第一次出现的字符

题目描述在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).(从0开始计数)。解:这道题其实有一个类似的题,就是字符串中仅出现一次的值(其余出现偶数次),当时用的是偶数次相消,其实这里是一样的,只不过其余字符出现次数不确定而已。这里也不能用数组标记,因为不确定编码方式,也就不确定字符数值->不确定数组长度,开多了反而影响效率。这里用的是map(因为要存位置,还得统计次数),如果

2020-09-04 16:34:59 190

原创 百度:最大子数组乘积

题目描述给定一个double类型的数组arr,其中的元素可正可负可0,返回子数组累乘的最大乘积。例如arr=[-2.5,4,0,3,0.5,8,-1],子数组[3,0.5,8]累乘可以获得最大的乘积12,所以返回12。解:子数组问题一般就直接DP做就很快,那么这里最普通的DP做法应该就是二维表,这道题显然不需要全遍历,因为 a[i[[j] 和 a[j][i] 是一样的,所以我们需要O(n^2/2)的遍历,即三角遍历,而非正方形遍历。那么辅助空间上,这道题是逐行求解,其实辅助空间可以压缩到O(1)

2020-09-03 22:57:40 137

原创 简:链表的公共节点

题目描述输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)解:这道题注意是公共节点,而非相同节点,如果是相同节点我们就直接用HashSet做了。当然这道题也是能用HashSet做的,只不过有一种不需要辅助空间,时间上依然是O(m+n)的做法。因为是公共节点,意味着如果在第一个公共节点重合,那么后面的链表就合起来了,也就是公共时,两个链表走过的结点数应该是一致的。当length1==length2时,我们只需要判断

2020-09-02 22:59:20 1289

原创 中:减绳子

题目描述给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1,m<=n),每段绳子的长度记为k[1],...,k[m]。请问k[1]x...xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。解:这道题可以数组下标标记法+递归做,我们这里用迭代,也就是DP了。我们先求出前几个特殊的,即1、2、3,这里要特别注意,1、2、3不得不切应该是0、1、2(其实n=1是没有的),但是我们

2020-09-01 16:10:48 112

原创 中:反转链表并重赋值

题目描述输入一个链表,按链表从尾到头的顺序返回一个ArrayList。解:这道题可以用数组直接倒着存储,时间上O(n)即可完成,且无额外辅助空间。具体操作:正序遍历链表,同时每次都在array(0)--调用ArrayList的带下标插入方法--位置插入新值,这样的话使用的是动态数组了。也可以建立辅助数组,先计算出length,然后链表节点i存储在length-i的位置,也可以完成倒序存储。另外的,也可以将链表倒序后再存储,这样麻烦一点,但是你也可以顺便练练链表反转的操作。这里贴反转的...

2020-09-01 14:52:31 117

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除