摘要: 4. 寻找两个正序数组的中位数 给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出这两个正序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。你可以假设 nums1 和 nums2 不会同时为空。 1.解题思路 题目要求时间复杂度为 O(lo 阅读全文
posted @ 2020-05-24 19:19 xiaoqichaoren 阅读(153) 评论(0) 推荐(0)
摘要: 105. 从前序与中序遍历序列构造二叉树 根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3 / \ 9 20 / 阅读全文
posted @ 2020-05-24 19:16 xiaoqichaoren 阅读(159) 评论(0) 推荐(0)
摘要: 210. 课程表 II 现在你总共有 n 门课需要选,记为 0 到 n-1。 在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1] 给定课程总量以及它们的先决条件,返回你为了学完所有课程所安排的学习顺序。 可能会有多个正确的顺 阅读全文
posted @ 2020-05-24 19:14 xiaoqichaoren 阅读(135) 评论(0) 推荐(0)
摘要: 680. 验证回文字符串 Ⅱ 给定一个非空字符串 s,最多删除一个字符。判断是否能成为回文字符串。 示例 2: 输入: "abca" 输出: True 解释: 你可以删除c字符。 1.解题思路 这道题用双指针,从两头往中间遍历。 步骤: (1)如果找不到两个对称位置不同的元素的下标,直接返回 Tru 阅读全文
posted @ 2020-05-24 19:12 xiaoqichaoren 阅读(185) 评论(0) 推荐(0)
摘要: 5. 最长回文子串 给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。 1.解题思路 根据回文串的特征,我们知道回文串除去两端的子串仍然是回文串,递归地拆除两端我们可以得到两种情况:长度为1的子串或长度为2的子串。 那么,反过来我们可以遍历字符串s,并对每个字符 阅读全文
posted @ 2020-05-24 19:09 xiaoqichaoren 阅读(127) 评论(0) 推荐(0)
摘要: 152. 乘积最大子数组 给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。 1.解题思路 与(53. 最大子序和)解法一致,不同的是“负负得正”。当遍历到数组中的负数时,我们希望以它前一个位置结尾的某个段的积也是个负数,这样 阅读全文
posted @ 2020-05-24 19:08 xiaoqichaoren 阅读(128) 评论(0) 推荐(0)
摘要: 136. 只出现一次的数字 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 说明: 你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗? 1.解题思路 解法一:使用哈希表存储每个数字。遍历数组即可知道当前数字是否出现过。如果出现过, 阅读全文
posted @ 2020-05-24 19:06 xiaoqichaoren 阅读(163) 评论(0) 推荐(0)
摘要: 206. 反转链表 反转一个单链表。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 1.解题思路 我们可以申请两个指针,第一个指针叫 pre,最初是指向 null 的。 第二个指针 cur 指向 head,然后不断遍历 cur。 每次迭代到 阅读全文
posted @ 2020-05-24 19:04 xiaoqichaoren 阅读(129) 评论(0) 推荐(0)
摘要: 25. K 个一组翻转链表 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。 k 是一个正整数,它的值小于或等于链表的长度。 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。 示例: 给你这个链表:1->2->3->4->5 当 k = 2 时,应当返回: 2-> 阅读全文
posted @ 2020-05-24 19:02 xiaoqichaoren 阅读(168) 评论(0) 推荐(0)
摘要: 155. 最小栈 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。 push(x) —— 将元素 x 推入栈中。 pop() —— 删除栈顶的元素。 top() —— 获取栈顶元素。 getMin() —— 检索栈中的最小元素。 1.解题思路 在普通的栈设计(见 阅读全文
posted @ 2020-05-24 19:00 xiaoqichaoren 阅读(148) 评论(0) 推荐(0)
摘要: 102. 二叉树的层序遍历 给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。 示例: 二叉树:[3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回其层次遍历结果: [ [3], [9,20], [15,7] ] 1 阅读全文
posted @ 2020-05-24 18:59 xiaoqichaoren 阅读(151) 评论(0) 推荐(0)
摘要: 236. 二叉树的最近公共祖先 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。” 例如,给定如下二叉树 阅读全文
posted @ 2020-05-24 18:57 xiaoqichaoren 阅读(199) 评论(0) 推荐(0)
摘要: 50. Pow(x, n) 实现 pow(x, n) ,即计算 x 的 n 次幂函数。 示例: 输入: 2.00000, 10 输出: 1024.00000 1.解题思路 「快速幂算法」的本质是分治算法。 X ^n=X ^(n/2)*X ^(n/2),当n为奇数时,X ^n=X ^((n-1)/2) 阅读全文
posted @ 2020-05-24 18:55 xiaoqichaoren 阅读(162) 评论(0) 推荐(0)
摘要: 221. 最大正方形 在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积。 1.解题思路(动态规划) 若形成正方形(非单 1),以当前为右下角的视角看,则需要:当前格、上、左、左上都是 1 可以换个角度:当前格、上、左、左上都不能受 0 的限制,才能成为正方形 递归式 阅读全文
posted @ 2020-05-24 18:54 xiaoqichaoren 阅读(218) 评论(0) 推荐(0)
摘要: 69. x 的平方根 计算并返回 x 的平方根,其中 x 是非负整数。 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。 1.解题思路 从小到大遍历整个数列找到x,使x^2>num。此时,x-1就是此题的解。至于查找就用二分搜索(因为二分搜索快)。今天这题太简单了,没劲!!!! 2.源码 阅读全文
posted @ 2020-05-24 18:52 xiaoqichaoren 阅读(162) 评论(0) 推荐(0)
摘要: 983. 最低票价 在一个火车旅行很受欢迎的国度,你提前一年计划了一些火车旅行。在接下来的一年里,你要旅行的日子将以一个名为 days 的数组给出。每一项是一个从 1 到 365 的整数。 火车票有三种不同的销售方式: 一张为期一天的通行证售价为 costs[0] 美元; 一张为期七天的通行证售价为 阅读全文
posted @ 2020-05-24 18:51 xiaoqichaoren 阅读(145) 评论(0) 推荐(0)
摘要: 45. 跳跃游戏 II 给定一个非负整数数组,你最初位于数组的第一个位置。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 你的目标是使用最少的跳跃次数到达数组的最后一个位置。 1.解题思路 「贪心」地进行正向查找,每次找到可到达的最远位置(贪心思想),就可以在线性时间内得到最少的跳跃次数。 例 阅读全文
posted @ 2020-05-24 18:49 xiaoqichaoren 阅读(127) 评论(0) 推荐(0)
摘要: 56:合并区间 给出一个区间的集合,请合并所有重叠的区间。 1.解题思路 -先将子列表的较小值按从小到大排序 -然后比较后一个的较小值和当前的较大值 若前者不大于后者则将[当前的较小值,后一个的较大值]添加到结果集中 否则,直接将当前的列表,添加到结果集 2.源码 阅读全文
posted @ 2020-05-24 18:48 xiaoqichaoren 阅读(168) 评论(0) 推荐(0)
摘要: 202. 快乐数 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果 可以变为 1,那么这个数就是快乐数。 如果 n 是快乐数就返回 True ; 阅读全文
posted @ 2020-05-24 18:46 xiaoqichaoren 阅读(151) 评论(0) 推荐(0)
摘要: 53. 最大子序和 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 一、解题思路 设置一个数组,用来存动态规划的所有最优解,这个数组存的是以当前元素为最后一个元素的最大子序和 动态规划的递归式:m[i]=max(nums[i],nums[i]+ 阅读全文
posted @ 2020-05-24 18:43 xiaoqichaoren 阅读(139) 评论(0) 推荐(0)
摘要: 200:岛屿问题 给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。 岛屿总是被水包围,并且每座岛屿只能由水平方向或竖直方向上相邻的陆地连接形成。 此外,你可以假设该网格的四条边均被水包围。 一、解题思路——把一块“区域”看作是一个图的邻接矩阵,1的个数即是岛屿的 阅读全文
posted @ 2020-05-24 18:41 xiaoqichaoren 阅读(253) 评论(0) 推荐(0)
摘要: 21. 合并两个有序链表 将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 1.解题思路 创建一个新的链表,用归并排序的思想将两个链表插入到新链表中 2.源码 阅读全文
posted @ 2020-05-24 18:40 xiaoqichaoren 阅读(154) 评论(0) 推荐(0)
摘要: 3. 无重复字符的最长子串 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。 一、解题思路 设置两个从左部到右部的指针,左指针遍历所有元素;在左指针不动的情况下,右指针向后移动直到重复的元素。考虑用双指针的滑动窗口算法(sliding window) 二、源码 阅读全文
posted @ 2020-05-24 18:39 xiaoqichaoren 阅读(174) 评论(0) 推荐(0)
摘要: 面试题56 - I. 数组中数字出现的次数 一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。 1.解题思路 先创一个结果集,由于时间复杂度为O(n)。直接遍历数组。若某值存在于结果集,从结果集中删除; 阅读全文
posted @ 2020-05-24 18:37 xiaoqichaoren 阅读(153) 评论(0) 推荐(0)
摘要: 33: 搜索旋转排序数组 假设按照升序排序的数组在预先未知的某个点上进行了旋转。 ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。 搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。 你可以假设数组中不存在重复的元素。 你 阅读全文
posted @ 2020-05-24 18:06 xiaoqichaoren 阅读(203) 评论(0) 推荐(0)
摘要: 面试51数组逆序对 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。 一、解题思路 (逆序对的思想就是从两个中比大小。若后边的小,逆序对+1。考虑用归并的思想) 1.递归地将源列表二分,并对两个列表排序(可以用sort()排 阅读全文
posted @ 2020-05-24 18:05 xiaoqichaoren 阅读(189) 评论(0) 推荐(0)
摘要: 1248:统计「优美子数组」 给你一个整数数组 nums 和一个整数 k。 如果某个 连续 子数组中恰好有 k 个奇数数字,我们就认为这个子数组是「优美子数组」。 请返回这个数组中「优美子数组」的数目。 一、算法思路 -找到第 i 个奇数的位置,找到第i+k-1个奇数的位置,这就确定了两个边界,再看 阅读全文
posted @ 2020-05-24 18:01 xiaoqichaoren 阅读(195) 评论(0) 推荐(0)
摘要: 199: 二叉树的右视图 给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。 一、解题思路 1.用到二叉树的BFS。根据题意二叉树每一行的最右边的一个数就是所求 2.BFS一定会用到队列,这道题也不列外。由于结果是每一行中的一个,这道题每一行都要分隔开来。 - 阅读全文
posted @ 2020-05-24 17:35 xiaoqichaoren 阅读(205) 评论(0) 推荐(0)
摘要: 11:盛最多水的容器 给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 说明:你不能倾斜容器,且  阅读全文
posted @ 2020-05-24 17:33 xiaoqichaoren 阅读(146) 评论(0) 推荐(0)
摘要: 542:01矩阵 给定一个由 0 和 1 组成的矩阵,找出每个元素到最近的 0 的距离。 两个相邻元素间的距离为 1 。 1.解题思路 题目中说1到最近的0的距离,可以等价为0到1的距离。可以抽象为0到非0的一个图,以0为起点对这个图进行广度优先搜索 2.代码实现 3.执行过程 阅读全文
posted @ 2020-05-24 17:31 xiaoqichaoren 阅读(230) 评论(0) 推荐(0)
摘要: 最长公共子序列 1.算法思路 主要流程如上图所示,动态规划主要体现在两个辅助的二维数组(把每一步执行所的的结果都存起来)。最后,构造最优解的时候,利用辅助二维数组得到最优解 *2.算法实现 def LCS(lisx, lisy): # 构造最优解,x 和 y 从最大值出发,直到有一个为 0(到边上了 阅读全文
posted @ 2020-05-24 17:29 xiaoqichaoren 阅读(259) 评论(0) 推荐(0)
摘要: 动态规划(DP)与分治法类似,也是将待求解问题分成若干子问题。不同的是,适用于动态规划求解的问题,经分解得到的子问题往往不是互相独立的。而用分治法求解时往往耗费指数时间,有时有些子问题被重复计算了很多次。这样浪费了大量的时间和空间。此时就需要用到动态规划:用一个表记录所有已解决的子问题的答案。不管以 阅读全文
posted @ 2020-05-24 17:27 xiaoqichaoren 阅读(426) 评论(0) 推荐(0)
摘要: 图的存储结构相对于线性表和树来说更为复杂,因为图中的顶点具有相对概念,没有固定的位置。图是由(V, E)来表示的,V是顶点的集合,E是边的集合。 图看起来就像下图这样: 图有各种形状和大小。边可以有权重(weight),即每一条边会被分配一个正数或者负数值。边是可以有方向的。在上面提到的例子中,边是 阅读全文
posted @ 2020-05-24 17:26 xiaoqichaoren 阅读(243) 评论(0) 推荐(0)
摘要: 1.栈 栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。栈可以用来在函数调用的时候 阅读全文
posted @ 2020-05-24 17:25 xiaoqichaoren 阅读(206) 评论(0) 推荐(0)
摘要: 链表是一种物理存储结构上非连续,非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 无头单向非循环列表:结构简单,一般不会单独用来存放数据。实际中更多是作为其他数据结构的子结构,比如说哈希桶等等。 带头双向循环链表:结构最复杂,一般单独存储数据。实际中经常使用的链表数据结构,都是 阅读全文
posted @ 2020-05-24 17:24 xiaoqichaoren 阅读(182) 评论(0) 推荐(0)
摘要: 一、哈希表 散列表,也叫哈希表,是根据关键码和值 (key和value) 直接进行访问的数据结构。哈希表就是基于字典实现的 通过key和value来映射到集合中的一个位置,这样就可以很快找到集合中的对应元素。记录的存储位置=f(key)。这里的对应关系 f 称为散列函数,又称为哈希 (hash)函数 阅读全文
posted @ 2020-05-24 17:23 xiaoqichaoren 阅读(302) 评论(0) 推荐(0)
摘要: 1.数组 数组是可以再内存中连续存储多个元素的结构,在内存中的分配也是连续的,数组中的元素通过数组下标进行访问,数组下标从0开始。在python中没有数组,取而代之的是列表和元组 *2.栈 栈是一种特殊的线性表,仅能在线性表的一端操作,栈顶允许操作,栈底不允许操作。 栈的特点是:后进先出,从栈顶放入 阅读全文
posted @ 2020-05-24 17:22 xiaoqichaoren 阅读(333) 评论(0) 推荐(0)
摘要: 三、合并排序——T(n)=O(nlog2n) 1.算法思想 合并排序是用分治策略对n个元素进行排序的算法。基本思想是递归地将待排序元素分成大小相同的两个子序列(直到分到最小)。分别对这两个子序列进行排序(自底向上),然后将两个子序列合并到一起。如下图:先将序列递归拆分到不能再分;然后在逐层排序 *2 阅读全文
posted @ 2020-05-24 17:21 xiaoqichaoren 阅读(373) 评论(0) 推荐(0)
摘要: -基本思想 将一个规模为n的问题分解成k个规模较小的子问题。这些子问题互相独立且与原问题相同。递归的解这些子问题,然后将各子问题的解合并得到原问题的解 一、二分搜索算法 问题描述:在给定好的以排好序的n个元素的数组 l 中,查找出某一特定的值x 1.算法思想(T(n)=O(1)~O(log2n)) 阅读全文
posted @ 2020-05-24 17:20 xiaoqichaoren 阅读(262) 评论(0) 推荐(0)
摘要: 一、BFS:广度优先搜索 从某点开始,走该点所有的方向,然后再从这些路径中找可以走的路,直到最先找到符合条件的点,这个运用需要用到队列(FIFO队列)。这个过程叫做对图或树的遍历 *-算法模板 level = 0 # 代表当前遍历到的层数 while deque不空: # deque中的是当前所有父 阅读全文
posted @ 2020-05-24 17:16 xiaoqichaoren 阅读(149) 评论(0) 推荐(0)