随笔分类 - LeetCode
摘要:1. 题目 2. 解答 我们先来看一看回文子串的规律,如果回文子串的长度为偶数,那么其中所有的每个元素都出现了偶数次;如果回文子串的长度为奇数,那么有一个元素出现了奇数次而其余每个元素都出现了偶数次。 所以我们需要做的就是遍历一遍字符串,统计每个元素出现的次数。这里只有大写字母和小写字母,我们用一个
阅读全文
摘要:1. 题目 2. 解答 与最长回文子串类似,我们可以用动态规划来求解这个问题,只不过这里的子序列可以不连续。我们定义状态 state[i][j] 表示子串 s[i, j] 的最长回文子序列长度,那么状态转移方程为:
阅读全文
摘要:1. 题目 2. 解答 我们定义状态 state[i][j] 表示子串 s[i, j] 是否为回文子串,如果 s[i, j] 为回文子串,并且有 s[i 1] == s[j+1],那么 s[i 1, j+1] 也为回文子串。状态转移方程为: $$state[i][j] = 1 \space 如果 \
阅读全文
摘要:1. 题目 2. 解答 2.1. 动态规划 我们定义状态 state[i] 表示以 nums[i] 为结尾元素的最长上升子序列的长度,那么状态转移方程为: $$state[i] = max(state[j] + 1) \space 如果 \space nums[i] nums[j], 0 \leqs
阅读全文
摘要:1. 题目 2. 解答 在 "回溯算法" 中我们介绍了一种递归的思路来求解这个问题。 此外,这个问题也可以用动态规划的思路来解决。我们定义状态 为子串 和 是否匹配,能匹配为真,反之为假,然后状态转移方程则可以分为以下三种情况: 1. 如果
阅读全文
摘要:1. 题目 2. 解答 在 "LeetCode 46——全排列" 中我们已经知道,全排列其实就是先确定某一个位置的元素,然后余下就是一个子问题。在那个问题中,数据没有重复,所以数据中的任意元素都可以放在最后一个位置。 但是,如果数据有重复的话,重复的数据都放在最后则是一样的结果,我们需要进行一个去重
阅读全文
摘要:1. 题目 2. 解答 2.1. 方法一——大顶堆 参考 "堆和堆排序" 以及 "堆的应用" ,我们将数组的前 K 个位置当作一个大顶堆。 首先建堆,也即对堆中 [0, (K 2)/2] 的节点从上往下进行堆化。第 K/2 个节点若有子节点,其左子节点位置应该为 2 K/2 + 1 = K+1,而我
阅读全文
摘要:1. 题目 2. 解答 给定一个序列,序列中的任意一个数字都可以作为全排列的最后一位。然后,其余位置元素的确定便是剩余元素的一个全排列,也就是一个子问题。 例子中 [1, 2, 3] 的全排列,最后一位可以是 1 或者 2 或者 3。如果最后一位是 3,前两位便是 [1, 2] 的全排列。 我们用递
阅读全文
摘要:1. 题目 2. 解答 定义两个栈 s_l_r、s_r_l 分别负责从左到右和从右到左遍历某一层的节点,用标志变量 flag 来控制具体情况,根节点所在层 flag=1 表示从左到右遍历,每隔一层改变一次遍历方向。 用栈 s_l_r 从左到右遍历当前层节点时,按照先左子节点再右子节点的顺序将这一层节
阅读全文
摘要:1. 题目 2. 解答 借助于归并排序的分治思想,在 每次合并的时候 统计逆序对。因为要合并的两个数组都是有序的,如果左半部分数组当前值大于右半部分数组当前值,那么左半部分数组当前值右边的数就都大于右半部分数组当前值,这些数据对也就构成了逆序数对。 比如上图中 [3, 8, 9, 11] 和 [1,
阅读全文
摘要:1. 题目 2. 解答 初始化 sum=0,然后遍历数组进行累加。如果 sum 变为负数,也就说再继续累加的话贡献为负,我们需要更新 sum=0,重新开始累加。 初始化 max_sum 为数组的第一个元素,之所以不初始化为零,就是防止出现数组中全为负数的情况,比如 [ 2, 1, 3, 4, 5]。
阅读全文
摘要:1. 题目 2. 解答 定义两个指针,刚开始分别指向 1 和 2,求出位于这两个指针之间的元素和。如果和大于 S,前面的指针向后移直到和不大于 S 为止;反之,如果和等于 S,则此时两个指针之间的元素序列即为一个所求的结果,后面的指针向后移动。 第一个指针的范围为 $[1, \frac{S+1}{2
阅读全文
摘要:1. 题目 2. 解答 由于数组是已经排好序的,我们可以定义两个指针,第一个指针指向第一个元素,第二个指针指向最后一个元素,然后求出这两个元素的和,与目标和进行比较。若小于目标和,第一个指针向前移动;若大于目标和,第二个指针向后移动。 若等于目标和,题目中要求输出乘积最小的。由于两个元素的乘积肯定小
阅读全文
摘要:1. 题目 2. 解答 时间复杂度为 的算法,顺序遍历数组,当该数字第一次出现时开始记录次数。 获取更多精彩,请关注「seniusen」!
阅读全文
摘要:1. 题目 2. 解答 2.1 快速排序 可参考 "快速排序和归并排序" 中的第一种快速排序思想,与在数组中排序有两点不同。 第一,我们需要取最后一个元素作为主元,在数组中可以直接访问到最后一个元素,但在单链表中,我们需要 先遍历一遍链表才能访问到最后一个元素 。 第二,在数组中,利用主元将数组划分
阅读全文
摘要:1. 题目 2. 解答 2.1 方法一 left 数组表示当前元素左边比当前元素小的元素个数,right 数组数组表示当前元素右边比当前元素小的元素个数。在山脉的中间 B[i] 处,其左边和右边肯定都有小于 B[i] 的元素,而山脉的长度即为 left[i] + right[i] + 1。 c cl
阅读全文
摘要:1. 题目 2. 解答 字典序排数可以看做是第一层节点分别为 1 9 的十叉树,然后我们在树上找到第 K 小的数字即可。因此,我们需要分别统计以 1 9 为根节点的每个树的节点个数。 如果 K 小于当前树的节点个数,那么第 K 小的数字即在当前树中,我们进入子树继续查找;如果 K 大于当前树的节点个
阅读全文
摘要:1. 题目 2. 解答 2.1 方法一 假设返回 118 以内数的字典顺序,则为 1,10,100,101,102,...,109,11,110,111,112,...,118,12,13,...。根据这个序列,我们发现有以下几种情况。 1,10,100,每次都乘以 10 100,101,102,.
阅读全文
摘要:1. 题目 2. 解答 初始化左序奖赏全为 1,从左往右遍历,如果右边的人评分比左边高,右边奖赏比左边奖赏增 1。 初始化右序奖赏全为 1,从右往左遍历,如果左边的人评分比右边高,左边奖赏比右边奖赏增 1。 左序奖赏和右序奖赏的最大值就是该孩子的最终奖赏值。 c class Solution { p
阅读全文
摘要:1. 题目 2. 解答 详细解答方案可参考 "北京大学 MOOC 程序设计与算法(二)算法基础之动态规划部分" 。 从三角形倒数第二行开始,某一位置只能从左下方或者右下方移动而来,因此,我们只需要求出这两者的较小值然后再加上当前元素,即可得出从某一位置到最下边的最小路径和。以此类推,我们就可以求出最
阅读全文