02 2021 档案

【剑指Offer-37】序列化二叉树
摘要:问题 请实现两个函数,分别用来序列化和反序列化二叉树。 示例 你可以将以下二叉树: 1 / \ 2 3 / \ 4 5 序列化为 "[1,2,3,null,null,4,5]" 解答1:迭代(层序遍历) class Codec { public: // Encodes a tree to a sin
41
0
0
【剑指Offer-36】二叉搜索树与双向链表
摘要:问题 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。 示例 解答1:递归 class Solution { public: Node* treeToDoublyList(Node* root) { if (!root) retu
42
0
0
【剑指Offer-35】复杂链表的复制
摘要:问题 请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。 // Definition for a Node. class Node { public: int
48
0
0
【剑指Offer-34】二叉树中和为某一值的路径
摘要:问题 输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。 示例 解答 class Solution { public: vector<vector<int>> pathSum(TreeNode* root, int su
38
0
0
【剑指Offer-33】二叉搜索树的后序遍历序列
摘要:问题 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。 示例 输入: [1,6,3,2,5] 输出: false 输入: [1,3,2,6,5] 输出: true 解答1:递归 class Solut
50
0
0
【LeetCode-395】至少有K个重复字符的最长子串
摘要:问题 给你一个字符串 s 和一个整数 k ,请你找出 s 中的最长子串, 要求该子串中的每一字符出现次数都不少于 k 。返回这一子串的长度。 示例 输入: s = "ababbc", k = 2 输出: 5 解释: 最长子串为 "ababb" ,其中 'a' 重复了 2 次, 'b' 重复了 3 次
176
0
0
【LeetCode-1178】猜字谜
摘要:问题 字谜的迷面 puzzle 按字符串形式给出,如果一个单词 word 符合下面两个条件,那么它就可以算作谜底: 单词 word 中包含谜面 puzzle 的第一个字母。 单词 word 中的每一个字母都可以在谜面 puzzle 中找到。 例如,如果字谜的谜面是 "abcdefg",那么可以作为谜
77
0
0
【剑指Offer-20】表示数值的字符串
摘要:问题 请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。 示例 字符串"+100"、"5e2"、"-123"、"3.1416"、"-1E-16"、"0123"都表示数值, 但"12e"、"1a3.14"、"1.2.3"、"+-5"及"12e+5.4"都不是。 解答1:确定有限状态自动机(D
54
0
0
【C++】快速幂运算
摘要:迭代 可以将幂运算的幂改为二进制写法,很容易就能找到其中的规律。 class Solution { public: int m = 1000000007; // 取模防止结果超出范围 long myPow(long x, int n) { long res = 1; while (n > 0) {
319
0
0
【剑指Offer-32-III】从上到下打印二叉树 III
摘要:问题 请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。 // Definition for a binary tree node. struct TreeNode { int val; TreeNo
45
0
0
【剑指Offer-32-II】从上到下打印二叉树 II
摘要:问题 请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。 // Definition for a binary tree node. struct TreeNode { int val; TreeNo
42
0
0
【剑指Offer-31】栈的压入、弹出序列
摘要:问题 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。 示例 输入: pushed = [1,2,3,4,5], popped = [4,5,3,2,1] 输出: true 解释: 我们可以按以下顺序执行: push(1), push
46
0
0
【剑指Offer-30】包含min函数的栈
摘要:问题 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。 解答 class MinStack { public: void push(int x) { s.push(x); if (s_min.empty(
43
0
0
【剑指Offer-29】顺时针打印矩阵
摘要:问题 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。 示例 输入: matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出: [1,2,3,6,9,8,7,4,5] 解答 class Solution { public: vector<int> spiralOrd
38
0
0
【剑指Offer-19】正则表达式匹配
摘要:问题 请实现一个函数用来匹配包含'. '和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但与"aa.a"和"ab*a"均不匹配。
58
0
0
【剑指Offer-14】剪绳子
摘要:问题 给你一根长度为n的绳子,请把绳子剪成整数长度的m段(m、n都是整数,n>1并且m>1),每段绳子的长度记为k[0],k[1]...k[m-1] 。请问k[0]*k[1]*...*k[m-1]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘
46
0
0
【C++】二叉树4种遍历方式的递归和迭代实现
摘要:前序遍历:根左右 递归 class Solution { vector<int> res; public: vector<int> preorderTraversal(TreeNode* root) { if (!root) return {}; // 前序操作 res.push_back(root
318
0
0
【剑指Offer-28】对称的二叉树
摘要:问题 请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。具体定义如下: 解答1:递归 class Solution { public: bool isSymmetric(TreeNode* root) { if (!root) return true; r
44
0
0
【LeetCode-1438】绝对差不超过限制的最长连续子数组
摘要:问题 给你一个整数数组 nums,和一个表示限制的整数 limit,请你返回最长连续子数组的长度,该子数组中的任意两个元素之间的绝对差必须小于或者等于limit 。 如果不存在满足条件的子数组,则返回0。 示例 输入: nums = [10,1,2,4,7,2], limit = 5 输出: 4 解
114
0
0
【LeetCode-697】数组的度
摘要:问题 给定一个非空且只包含非负数的整数数组 nums,数组的度的定义是指数组里任一元素出现频数的最大值。 你的任务是在 nums 中找到与 nums 拥有相同大小的度的最短连续子数组,返回其长度。 提示: nums.length 在1到 50,000 区间范围内; nums[i] 是一个在 0 到
39
0
0
【剑指Offer-26】树的子结构
摘要:问题 输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构) B是A的子结构,即A中有出现和B相同的结构和节点值。 例如: 给定的树A与树B: 返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。 示例 输入: A = [1,2,3], B = [3,1]
24
0
0
【剑指Offer-25】合并两个排序的链表
摘要:问题 输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。 示例 输入: 1->2->4, 1->3->4 输出: 1->1->2->3->4->4 解答1:迭代 class Solution { public: ListNode* mergeTwoLists(ListNode
37
0
0
【剑指Offer-24】反转链表
摘要:问题 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。 Definition for singly-linked list. struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(N
26
0
0
【剑指Offer-22】链表中倒数第k个节点
摘要:问题 输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。 例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 2 个节点是值为 4 的节点。 示例 给定一个链表: 1->2->3->4
26
0
0
【剑指Offer-21】调整数组顺序使奇数位于偶数前面
摘要:问题 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。 字符串面试题(三)— 把一个字符串的大写字母放到字符串的后面升级版待补充。 示例 输入: nums = [1,2,3,4] 输出: [1,3,2,4] 注: [3,1,2,4]
25
0
0
【剑指Offer-18】删除链表的节点
摘要:问题 给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。题目保证链表中节点的值互不相同。返回删除后的链表的头节点。 示例 输入: head = [4,5,1,9], val = 5 输出: [4,1,9] 解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表
22
0
0
【剑指Offer-16】数值的整数次方
摘要:问题 实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。 示例 输入: 2.10000, 3 输出: 9.26100 输入: 2.00000, -2 输出: 0.25000 解释: 2-2
34
0
0
【剑指Offer-15】二进制中1的个数
摘要:问题 请实现一个函数,输入一个整数(以二进制串形式),输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。 示例 输入: 00000000000000000000000000001011 输出: 3 解释: 输入的二进制串
32
0
0
【剑指Offer-13】机器人的运动范围
摘要:问题 地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3
24
0
0
【剑指Offer-12】矩阵中的路径
摘要:问题 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用
24
0
0
【剑指Offer-11】旋转数组的最小数字
摘要:问题 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。 示例 输入:[3,4,5,1,2] 输出:1 输入:[2,2,2,0,1
22
0
0
【LeetCode-153】寻找旋转排序数组中的最小值
摘要:问题 假设按照升序排序的数组在预先未知的某个点上进行了旋转。例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] 。 请找出其中最小的元素。 示例 输入:nums = [3,4,5,1,2] 输出:1 输入:nums = [4,5,6,7,0,1,2] 输出:0 解答
23
0
0
【剑指Offer-10】I. 斐波那契数列
摘要:问题 写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下: F(0) = 0, F(1) = 1 F(N) = F(N - 1) + F(N - 2), 其中 N > 1. 斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两
18
0
0
【剑指Offer-09】用两个栈实现队列
摘要:问题 用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 ) 示例 输入: ["CQueue","appendTail","dele
18
0
0
【剑指Offer-07】重建二叉树
摘要:问题 输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 // Definition for a binary tree node. struct TreeNode { int val; TreeNode *left; TreeNode *
25
0
0
【剑指Offer-06】从尾到头打印链表
摘要:问题 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。 // Definition for singly-linked list. struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(
27
0
0
【剑指Offer-04】二维数组中的查找
摘要:问题 在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 示例 现有矩阵 matrix 如下: [ [1, 4, 7, 11, 15], [2, 5, 8, 12
73
0
0
【剑指Offer-03】数组中重复的数字
摘要:问题 找出数组中重复的数字。 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。 示例 输入: [2, 3, 1, 0, 2, 5, 3] 输出:2 或 3 解答1
55
0
0
【LeetCode-42】接雨水
摘要:问题 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例 输入: [0,1,0,2,1,0,1,3,2,1,2,1] 输出: 6 解答1:备忘录 class Solution { public: int trap(vector<int>& hei
52
0
0
【LeetCode-375】猜数字大小 II
摘要:问题 我们正在玩一个猜数游戏,游戏规则如下: 我从 1 到 n 之间选择一个数字,你来猜我选了哪个数字。 每次你猜错了,我都会告诉你,我选的数字比你的大了或者小了。 然而,当你猜了数字 x 并且猜错了的时候,你需要支付金额为 x 的现金。直到你猜到我选的数字,你才算赢得了这个游戏。 给定 n ≥ 1
85
0
0
【LeetCode-1162】地图分析
摘要:问题 你现在手里有一份大小为 N x N 的『地图』(网格) grid,上面的每个『区域』(单元格)都用 0 和 1 标记好了。其中 0 代表海洋,1 代表陆地,你知道距离陆地区域最远的海洋区域是是哪一个吗?请返回该海洋区域到离它最近的陆地区域的距离。 我们这里说的距离是『曼哈顿距离』(Manhat
114
0
0
【LeetCode-820】单词的压缩编码
摘要:问题 给定一个单词列表,我们将这个列表编码成一个索引字符串 S 与一个索引列表 A。 例如,如果这个列表是 ["time", "me", "bell"],我们就可以将其表示为 S = "time#bell#" 和 indexes = [0, 2, 5]。 对于每一个索引,我们可以通过从字符串 S 中
72
0
0
【LeetCode-208】实现 Trie (前缀树)
摘要:问题 Trie(发音类似 "try")或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补完和拼写检查。 请你实现 Trie 类: Trie() 初始化前缀树对象; void insert(String word) 向前缀树中插入字符
44
0
0
【LeetCode-174】地下城游戏
摘要:问题 一些恶魔抓住了公主(P)并将她关在了地下城的右下角。地下城是由 M x N 个房间组成的二维网格。我们英勇的骑士(K)最初被安置在左上角的房间里,他必须穿过地下城并通过对抗恶魔来拯救公主。 骑士的初始健康点数为一个正整数。如果他的健康点数在某一时刻降至 0 或以下,他会立即死亡。 有些房间由恶
46
0
0
【LeetCode-945】使数组唯一的最小增量
摘要:问题 给定整数数组 A,每次 move 操作将会选择任意 A[i],并将其递增 1。 返回使 A 中的每个值都是唯一的最少操作次数。 0 ⇐ A.length ⇐ 40000 0 ⇐ A[i] < 40000 示例 输入:[1,2,2] 输出:1 解释:经过一次 move 操作,数组将变为 [1,
59
0
0
【LeetCode-300】最长递增子序列
摘要:问题 给定一个无序的整数数组,找到其中最长递增子序列的长度。 示例 输入: [10,9,2,5,3,7,101,18] 输出: 4 解释: 最长的递增子序列是 [2,3,7,101],它的长度是 4。 解答1:动态规划 class Solution { public: int lengthOfLIS
125
0
0
【LeetCode-45】跳跃游戏 II
摘要:问题 给定一个非负整数数组,你最初位于数组的第一个位置。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 你的目标是使用最少的跳跃次数到达数组的最后一个位置。 说明: 假设你总是可以到达数组的最后一个位置。 示例 输入: [2,3,1,1,4] 输出: 2 解释: 跳到最后一个位置的最小跳跃数是
40
0
0
【LeetCode-1071】字符串的最大公因子
摘要:问题 对于字符串 S 和 T,只有在 S = T + ... + T(T 与自身连接 1 次或多次)时,我们才认定 “T 能除尽 S”。 返回最长字符串 X,要求满足 X 能除尽 str1 且 X 能除尽 str2。 示例 输入:str1 = "ABABAB", str2 = "ABAB" 输出:"
79
0
0
【LeetCode-55】跳跃游戏
摘要:问题 给定一个非负整数数组,你最初位于数组的第一个位置。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个位置。 示例 输入: [2,3,1,1,4] 输出: true 解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个
42
0
0
【LeetCode-220】存在重复元素 III
摘要:问题 给定一个整数数组,判断数组中是否有两个不同的索引 i 和 j,使得 nums [i] 和 nums [j] 的差的绝对值最大为 t,并且 i 和 j 之间的差的绝对值最大为 k。 示例 输入: nums = [1,2,3,1], k = 3, t = 0 输出: true 输入: nums =
46
0
0
【LeetCode-219】存在重复元素 II
摘要:问题 给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的绝对值最大为 k。 示例 输入: nums = [1,2,3,1], k = 3 输出: true 输入: nums = [1,0,1,1], k
47
0
0
【LeetCode-275】H指数 II
摘要:问题 给定一位研究者论文被引用次数的数组(被引用次数是非负整数),数组已经按照升序排列。编写一个方法,计算出研究者的 h 指数。 h 指数的定义: “h 代表“高引用次数”(high citations),一名科研人员的 h 指数是指他(她)的 (N 篇论文中)至多有 h 篇论文分别被引用了至少 h
56
0
0
【LeetCode-274】H指数
摘要:问题 给定一位研究者论文被引用次数的数组(被引用次数是非负整数)。编写一个方法,计算出研究者的 h 指数。 h 指数的定义: “h 代表“高引用次数”(high citations),一名科研人员的 h 指数是指他(她)的 (N 篇论文中)至多有 h 篇论文分别被引用了至少 h 次。(其余的 N -
184
0
0
【LeetCode-119】杨辉三角 II
摘要:问题 给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。 示例 输入: 3 输出: [1,3,3,1] 解答 class Solution { public: vector<int> getRow(int rowIndex) { vector<int> result; for (i
37
0
0
【LeetCode-72】编辑距离
摘要:问题 给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作: 插入一个字符 删除一个字符 替换一个字符 示例 输入:word1 = "horse", word2 = "ros" 输出:3 解释: horse
51
0
0
【LeetCode-695】岛屿的最大面积
摘要:问题 给定一个包含了一些 0 和 1的非空二维数组 grid , 一个 岛屿 是由四个方向 (水平或垂直) 的 1 (代表土地) 构成的组合。你可以假设二维矩阵的四个边缘都被水包围着。 找到给定的二维数组中最大的岛屿面积。(如果没有岛屿,则返回面积为0。) 示例 [[0,0,1,0,0,0,0,1,
69
0
0
【LeetCode-999】可以被一步捕获的棋子数
摘要:问题 在一个 8 x 8 的棋盘上,有一个白色车(rook)。也可能有空方块,白色的象(bishop)和黑色的卒(pawn)。它们分别以字符 “R”,“.”,“B” 和 “p” 给出。大写字符表示白棋,小写字符表示黑棋。 车按国际象棋中的规则移动:它选择四个基本方向中的一个(北,东,西和南),然后朝
44
0
0
【LeetCode-48】旋转图像
摘要:问题 给定一个 n × n 的二维矩阵表示一个图像。 将图像顺时针旋转 90 度。 说明: 你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。 示例 示例 2: 给定 matrix = [ [ 5, 1, 9,11], [ 2, 4, 8,10], [13,
48
0
0
点击右上角即可分享
微信分享提示