随笔分类 -  Leet code

摘要:LeetCode上的三道关于树的遍历题目: 144二叉树的前序遍历 94二叉树的中序遍历 145二叉树的后序遍历 递归解法 递归是最容易的。递归是函数自身调用自身,涉及到保护现场(变量入栈,记录地址等),时间和空间开销较大,而这操作都是在栈上,调用层级太多很容易溢出。 其与迭代最大的区别就是是否会栈 阅读全文
posted @ 2020-08-10 10:41 Tanglement 阅读(210) 评论(0) 推荐(0)
摘要:题目 (来自LeetCode) 给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个细胞。每个细胞都具有一个初始状态:1 即为活细胞(live),或 0 即为死细胞(dead)。每个细胞与其八个相邻位置(水平,垂直,对角线)的细胞都遵循以下四条生存定律: 如果活细胞周围八个位置的活细胞 阅读全文
posted @ 2020-06-24 10:32 Tanglement 阅读(134) 评论(0) 推荐(0)
摘要:题目 假设按照升序排序的数组在预先未知的某个点上进行了旋转。 ( 例如,数组[0,1,2,4,5,6,7]可能变为[4,5,6,7,0,1,2])。 搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回-1。 你可以假设数组中不存在重复的元素。 你的算法时间复杂度必须是O(log 阅读全文
posted @ 2020-06-23 11:03 Tanglement 阅读(136) 评论(0) 推荐(0)
摘要:题目 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target。该矩阵具有以下特性: 每行的元素从左到右升序排列 每列的元素从上到下升序排列 思路 暴力就是矩阵都搜过一遍,看有没有目标值,但肯定不是题目本意。 通过观察给出的矩阵,可以发现如果从矩阵左上角和右下角出发,当 阅读全文
posted @ 2020-06-18 10:53 Tanglement 阅读(176) 评论(0) 推荐(0)
摘要:给定一个链表,删除链表的倒数第n个节点,并且返回链表的头结点。 两次循环 思路:第一次循环找出链表的总长度,第二次循环将倒数第n个节点删除。 在链表头结点前加一个空节点,可以简化操作,对于删除头结点的情况不用特殊处理。 一次循环 思路:一次循环就要在循环中确定倒数n个节点的位置。设置两个指针p,q, 阅读全文
posted @ 2020-04-08 12:34 Tanglement 阅读(119) 评论(0) 推荐(0)
摘要:给定一个包含n个整数的数组nums和一个目标值target,判断nums中是否存在四个元素a,b,c和d,适合a+b+c+d的值与target相等?找出所有满足条件且不重复的四元组。 与三数之和一样的思路。前两个数两个循环,后两个数用指针遍历的方式。在整体循环框架、指针遍历码好后,要添加条件来增加遍 阅读全文
posted @ 2020-04-06 11:39 Tanglement 阅读(108) 评论(0) 推荐(0)
摘要:给定一个仅包含数字2 9的字符串,返回所有它能表示的字母组合。给出数字到字母的映射与电话按键相同。 思路 如何表示数字与字母的映射是一个问题,这个问题解决了,题目也就容易解决了。用哪个数据结构呢?Map。 解决完映射后,将输入的数字字符串遍历,将映射中的字母循环组合,即可遍历所有能表示的字母组合。可 阅读全文
posted @ 2020-04-03 13:36 Tanglement 阅读(130) 评论(0) 推荐(0)
摘要:给定一个包括n个整数的数组nums和一个目标值target。找出nums中的三个整数,使得它们的和与target最接近。返回这三个数的和。假定每组输入只存在唯一答案。 思路 可以借鉴上题的循环方式,双指针法。每次判断三个数之和与target的绝对值是否最小,是最小则返回之和,否则继续遍历。如果三数和 阅读全文
posted @ 2020-04-03 10:48 Tanglement 阅读(106) 评论(0) 推荐(0)
摘要:给你一个包含n个整数的数组nums,判断nums中是否存在三个元素a,b,c,使得a+b+c=0?请你找出所有满足条件且不可重复的三元组。 答案中不可以包含重复的三元组。 暴力解法 直接三个循环,遍历所有可能性,判断a+b+c=0,是的话记录。如何去除重复的三元组?用set记录三元组。相同三元组即可 阅读全文
posted @ 2020-04-02 13:24 Tanglement 阅读(147) 评论(0) 推荐(0)
摘要:编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""。 所有输入只包含小写字母a z。 思路 不断比较每个字符串的单个字符,若相等则用加入StringBuilder,直到不相等。 提交代码 其他人的解法 水平扫描 String字符串有一个indexOf(String 阅读全文
posted @ 2020-04-02 11:02 Tanglement 阅读(110) 评论(0) 推荐(0)
摘要:与12题一样的规则,将罗马数字转为整数。 思路 字符串str从左到右遍历,不断将一个长度和两个长度的子字符串与罗马字符匹配,匹配成功就将数值相加 小结 忘记了String相等不能用==,以至于索引报错,一直在想索引怎么会出错。要注意substring的索引不能超出边界,可以求长度来避免这个情况。 阅读全文
posted @ 2020-04-01 17:17 Tanglement 阅读(118) 评论(0) 推荐(0)
摘要:给定一个整数,将其转为罗马数字。输入确保在1到3999的范围内。 罗马数字包含以下七种字符:I,V,X,L,C,D,M 通常情况,小的数字放在大的数字右边。但是有六种特殊的情况: I可以放在V和X左边,表示4和9 X可以放在L和C的左边,表示40和90 C可以放在D和M的左边,表示400和900 主 阅读全文
posted @ 2020-04-01 16:17 Tanglement 阅读(138) 评论(0) 推荐(0)
摘要:给你n个非负整数a1,a2,...,an,每个数代表坐标中的一个点(i,ai)。在坐标内画n条垂直线,垂直线i的两个端点分别为(i,ai)和(i,0)。找出其中两条线,使得它们与x轴共同构成的容器可以容纳最多的水。 这题换算为数学题就是找到两个坐标点i,j,使得min(h[i],h[j]) (j i 阅读全文
posted @ 2020-04-01 13:30 Tanglement 阅读(108) 评论(0) 推荐(0)
摘要:给你一个字符串s和一个字符规律p,请你来实现一个支持 '.'和 ' '的正则表达式匹配 解决这个问题有两种方法:回溯和动态规划 回溯 字符串为s,正则表达式为p。 流程如下: 当p为NULL,s为NULL匹配成功,s不为NULL匹配失败。 s不为NULL,匹配s和p的第一个字符,注意 '.'。 判断 阅读全文
posted @ 2020-03-31 22:14 Tanglement 阅读(225) 评论(0) 推荐(0)
摘要:判断一个整数是否是回文数。 题解 普通解法:将整数转为字符串,然后对字符串做判断。 我的解法代码 取出后半段数字进行翻转 每次进行取余操作,取出最低数字 将最低数字加到取出数的末尾 每取一位最低数,x就要/10 判断x是否小于取出数,小于时代表已经对半 如果是偶数,则两者相等,如果是奇数,需要/10 阅读全文
posted @ 2020-02-28 15:00 Tanglement 阅读(124) 评论(0) 推荐(0)
摘要:实现一个atoi函数,使其能将字符串转成整数,根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。当我们寻找到的第一个非空字符为正或负号时,则将该符号与后面尽可能多的连续数字组合起来,作为该整数的正负号。之后可能有多余字符,可以被忽略。不能有效转换,返回0. 题解 没有什么优解,只能根 阅读全文
posted @ 2020-02-27 21:47 Tanglement 阅读(121) 评论(0) 推荐(0)
摘要:给出一个32位的有符号整数,你需要将这个整数中每位上的数字进行反转。 题解 简单题。每次把数x的个位数分离出来,用新的数y加起来。有堆栈的思想。 题目的难点在于不能溢出一个范围 所以解题过程中,需要有判断条件 我的解法代码 阅读全文
posted @ 2020-02-14 15:03 Tanglement 阅读(89) 评论(0) 推荐(0)
摘要:将一个给定字符串根据给定的行数,以从上往下、从左到右进行Z字形排列。 比如输入字符串"LEETCODEISHIRING"行数为3时,排列如下: 之后,你的输出需要从左往右逐行读取,产生一个新的字符串,比如"LCIRETOESIIGEDHN" 题解 这个思想很奇妙,时间复杂度和空间复杂度都是O(n), 阅读全文
posted @ 2020-02-12 13:58 Tanglement 阅读(93) 评论(0) 推荐(0)
摘要:给定一个字符串s,找到s中最长的回文子串。你可以假设s的最大长度为1000. 这题是很经典的题目,找到最长回文子串,回文就是bab,cabac这样的。 题解 解法一 暴力法,列举所有的子串,判断是否为回文串,很明显时间复杂度为O(n^2)。 解法二 将原字符串s倒置s',然后寻找最长回文串就变成寻找 阅读全文
posted @ 2020-02-11 15:46 Tanglement 阅读(149) 评论(2) 推荐(0)
摘要:给定两个大小为m和n的有序数组nums1和nums2。请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为O(log(m+n))。 你可以假设nums1和nums2不会同时为空。 题解 解法一 暴力法,即从头到尾找到合并数组的中位数。时间复杂度O(m+n) 解法二 看到log,要自然想到二分法 阅读全文
posted @ 2020-02-10 16:50 Tanglement 阅读(142) 评论(0) 推荐(0)