剑指 Offer(第 2 版)
文章平均质量分 50
伍粟
菜鸟码农
展开
-
剑指 Offer 51. 数组中的逆序对(C++) 归并排序
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。示例 1:输入: [7,5,6,4]输出: 5限制:0 <= 数组长度 <= 50000解题思路:基于归并排序的解法。1、本题其实就是在对一个数组进行归并排序的基础上,增加了一个统计逆序对数目的障眼法,其实还是归并排序。2、如果了解归并排序的话,就会想到我们可以用分治的思想,将给定的 nums 先一分为二,统计左半部分的逆序对数目,再统计右半部分的原创 2021-03-21 20:37:33 · 188 阅读 · 0 评论 -
剑指 Offer 42. 连续子数组的最大和(C++) 动态规划
输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。示例1:输入: nums = [-2,1,-3,4,-1,2,1,-5,4]输出: 6解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。提示:1 <= arr.length <= 10^5-100 <= arr[i] <= 100注意:本题与主站 53 题相同:https://leetcode-cn.com/problems/maximum-s原创 2021-03-15 21:21:12 · 237 阅读 · 0 评论 -
剑指 Offer 25. 合并两个排序的链表(C++) 迭代合并
输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。示例1:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4限制:0 <= 链表长度 <= 1000注意:本题与主站 21 题相同:https://leetcode-cn.com/problems/merge-two-sorted-lists/迭代思路我们可以用迭代的方法来实现上述算法。当 l1 和 l2 都不是空链表时,判断原创 2021-03-15 20:46:42 · 181 阅读 · 0 评论 -
剑指 Offer 11. 旋转数组的最小数字(C++) 二分法
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。示例 1:输入:[3,4,5,1,2]输出:1示例 2:输入:[2,2,2,0,1]输出:0注意:本题与主站 154 题相同:https://leetcode-cn.com/problems/find-minimum-in-rotated-sorted-array-ii/原创 2021-03-15 20:39:25 · 125 阅读 · 0 评论 -
剑指 Offer 58 - II. 左旋转字符串(C++) 块交换问题
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。示例 1:输入: s = "abcdefg", k = 2输出: "cdefgab"示例 2:输入: s = "lrloseumgh", k = 6输出: "umghlrlose"限制:1 <= k < s.length <= 10000解题思路:C++实现。 块交换原创 2021-03-15 20:12:33 · 119 阅读 · 0 评论 -
剑指 Offer 58 - I. 翻转单词顺序(C++) 双指针
输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. “,则输出"student. a am I”。示例 1:输入: "the sky is blue"输出: "blue is sky the"示例 2:输入: " hello world! "输出: "world! hello"解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。示例 3:输入: "a goo原创 2021-03-15 19:50:12 · 500 阅读 · 0 评论 -
剑指 Offer 67. 把字符串转换成整数(C++) 数字越界处理
写一个函数 StrToInt,实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,它们对于函数不应该造成影响。注意:假如该字符串中的第一个非空原创 2021-03-15 19:12:16 · 357 阅读 · 0 评论 -
剑指 Offer 44. 数字序列中某一位的数字(C++) 迭代 + 求整 / 求余
数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等。请写一个函数,求任意第n位对应的数字。注意:“数字以0123456789101112131415…的格式序列化”:数字的规律就是0开始,然后右侧的数字加一,逐渐递增到很大的数示例 1:输入:n = 3输出:3示例 2:输入:n = 11输出:0限制:0 <= n < 2^31注意:本题与主站 400 题相同:h原创 2021-03-13 21:45:03 · 215 阅读 · 0 评论 -
剑指 Offer 20. 表示数值的字符串(C++) 有限状态自动机
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100"、“5e2”、"-123"、“3.1416”、"-1E-16"、“0123"都表示数值,但"12e”、“1a3.14”、“1.2.3”、"±5"及"12e+5.4"都不是。解题思路:本题使用有限状态自动机。根据字符类型和合法数值的特点,先定义状态,再画出状态转移图,最后编写代码即可。字符类型:空格 「 」、数字「 0—90—9 」 、正负号 「 ±+− 」 、小数点 「 … 」 、幂符号 「 eE 」 。状态定义:原创 2021-03-13 20:50:23 · 322 阅读 · 0 评论 -
剑指 Offer 43. 1~n 整数中 1 出现的次数(C++) 高低位思路
输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。示例 1:输入:n = 12输出:5示例 2:输入:n = 13输出:6限制:1 <= n < 2^31注意:本题与主站 233 题相同:https://leetcode-cn.com/problems/number-of-digit-one/解题思路:某位中 1 出现次数的计算方法:根据当前位 cur 值的不原创 2021-03-13 20:16:11 · 147 阅读 · 0 评论 -
剑指 Offer 49. 丑数(C++) 动态规划
我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。示例:输入: n = 10输出: 12解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。说明:1 是丑数。n 不超过1690。注意:本题与主站 264 题相同:https://leetcode-cn.com/problems/ugly-number-ii/解题思路:class Solution {public: int原创 2021-03-13 18:02:38 · 200 阅读 · 0 评论 -
剑指 Offer 17. 打印从1到最大的n位数(C++) 递归+DFS
输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。示例 1:输入: n = 1输出: [1,2,3,4,5,6,7,8,9]说明:用返回一个整数列表来代替打印n 为正整数大数打印解法:实际上,本题的主要考点是大数越界情况下的打印。需要解决以下三个问题:1. 表示大数的变量类型:无论是 short / int / long … 任意变量类型,数字的取值范围都是有限的。因此,大数的表示应用字符串 String 类原创 2021-03-13 17:35:28 · 212 阅读 · 0 评论 -
剑指 Offer 14- II. 剪绳子 II(C++) 贪心+快速幂
给你一根长度为 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的三段,此时得到的最大乘积是18。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。比 剑指 Offer 14- I 多了求余数示例 1:输入: 2输出:原创 2021-03-13 11:35:22 · 214 阅读 · 0 评论 -
剑指 Offer 14- I. 剪绳子(C++) 贪心算法
给你一根长度为 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的三段,此时得到的最大乘积是18。示例 1:输入: 2输出: 1解释: 2 = 1 + 1, 1 × 1 = 1示例 2:输入: 10输出: 36解释: 10 = 3 + 3 + 4, 3 × 3 × 4 =原创 2021-03-13 11:05:37 · 191 阅读 · 0 评论 -
剑指 Offer 52. 两个链表的第一个公共节点(C++) 双指针法
输入两个链表,找出它们的第一个公共节点。如下面的两个链表:在节点 c1 开始相交。示例 1:输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3输出:Reference of the node with value = 8输入解释:相交节点的值为 8 (注意,如果两个列表相交则不能为 0)。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1原创 2021-03-13 10:40:47 · 85 阅读 · 0 评论 -
剑指 Offer 35. 复杂链表的复制(C++) 拼接 + 拆分
请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。示例 1:输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]示例 2:输入:head = [[1,1],[2,1]]输出:[[1,1],[2,1]]示例 3:输入:head原创 2021-03-12 20:48:22 · 98 阅读 · 0 评论 -
剑指 Offer 24. 反转链表(C++) 迭代
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL限制:0 <= 节点个数 <= 5000注意:本题与主站 206 题相同:https://leetcode-cn.com/problems/reverse-linked-list/解题思路:参考:https://blog.csdn.net/qq_304原创 2021-03-12 20:02:15 · 114 阅读 · 0 评论 -
剑指 Offer 18. 删除链表的节点(C++) 双指针
给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。注意:此题对比原题有改动示例 1:输入: head = [4,5,1,9], val = 5输出: [4,1,9]解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.示例 2:输入: head = [4,5,1,9], val = 1输出: [4,5,9]解释: 给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该原创 2021-03-12 19:53:23 · 153 阅读 · 0 评论 -
剑指 Offer 22. 链表中倒数第k个节点(C++) 双指针
输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。示例:给定一个链表: 1->2->3->4->5, 和 k = 2.返回链表 4->5.2 | 双指针思路:保证fast在slow前面k个节点的位置先让fast指针走k步, 然后slow和fast一起走, 当fast原创 2021-03-12 19:41:40 · 110 阅读 · 0 评论 -
剑指 Offer 06. 从尾到头打印链表(C++) 将节点的值倒着放入返回数组中
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。示例 1:输入:head = [1,3,2]输出:[2,3,1]限制:0 <= 链表长度 <= 10000思路:两次遍历链表,将节点的值倒着放入返回数组中。 时间复杂度O(N),空间复杂度O(1)。/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; *原创 2021-03-12 19:34:10 · 106 阅读 · 0 评论 -
剑指 Offer 50. 第一个只出现一次的字符(C++) 有序哈希表
在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。示例:s = "abaccdeff"返回 "b"s = "" 返回 " "限制:0 <= s 的长度 <= 50000有序哈希表在哈希表的基础上,有序哈希表中的键值对是 按照插入顺序排序 的。基于此,可通过遍历有序哈希表,实现搜索首个 “数量为 1 的字符”。哈希表是 去重 的,即哈希表中键值对数量 ≤ 字符串 s 的长度。因此,相比哈希表方法,减少了第二轮遍历的循环次数。当字符串原创 2021-03-12 19:22:59 · 208 阅读 · 0 评论 -
剑指 Offer 48. 最长不含重复字符的子字符串(C++) 数组(桶)Or 无辅助数组
请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。示例 1:输入: "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例 2:输入: "bbbbb"输出: 1解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。示例 3:输入: "pwwkew"输出: 3解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列原创 2021-03-12 18:57:55 · 132 阅读 · 0 评论 -
剑指 Offer 53 - II. 0~n-1中缺失的数字(C++) 二分法
一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。示例 1:输入: [0,1,3]输出: 2示例 2:输入: [0,1,2,3,4,5,6,7,9]输出: 8限制:1 <= 数组长度 <= 10000解题思路:方法一:二分法。对于有序的数组, 应该立即想到用二分法进行搜索。思路如下:注: 题目中的在范围0~n-1内的n个数字中有且只有一个数字不在该数原创 2021-03-11 19:53:00 · 190 阅读 · 0 评论 -
剑指 Offer 29. 顺时针打印矩阵(C++) 逐步压缩边界
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。示例 1:输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,6,9,8,7,4,5]示例 2:输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]输出:[1,2,3,4,8,12,11,10,9,5,6,7]限制:0 <= matrix.length <= 1000 <= matrix[i].length <= 100原创 2021-03-11 19:10:44 · 102 阅读 · 0 评论 -
剑指 Offer 04. 二维数组中的查找(C++) 修剪路线
在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。示例:现有矩阵 matrix 如下:[ [1, 4, 7, 11, 15], [2, 5, 8, 12, 19], [3, 6, 9, 16, 22], [10, 13, 14, 17, 24], [18, 21, 23, 26, 30]]给定 target = 5,返回原创 2021-03-11 18:52:00 · 127 阅读 · 0 评论 -
剑指 Offer 53 - I. 在排序数组中查找数字 I(C++) 二分法
统计一个数字在排序数组中出现的次数。示例 1:输入: nums = [5,7,7,8,8,10], target = 8输出: 2示例 2:输入: nums = [5,7,7,8,8,10], target = 6输出: 0限制:0 <= 数组长度 <= 50000注意:本题与主站 34 题相同(仅返回值不同):https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted原创 2021-03-10 21:42:57 · 137 阅读 · 0 评论 -
剑指 Offer 03. 数组中重复的数字(C++) 原地置换
找出数组中重复的数字。在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。示例 1:输入:[2, 3, 1, 0, 2, 5, 3]输出:2 或 3 限制:2 <= n <= 100000思路:如果没有重复数字,那么正常排序后,数字i应该在下标为i的位置,所以思路是重头扫描数组,遇到下标为i的数字如果不是i的话,(假设为m),那么我们就拿与下标原创 2021-03-10 20:56:32 · 150 阅读 · 0 评论 -
剑指 Offer 59 - I. 滑动窗口的最大值(C++) 单调队列
给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。示例:输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3输出: [3,3,5,5,6,7] 解释: 滑动窗口的位置 最大值--------------- -----[1 3 -1] -3 5 3 6 7 3 1 [3 -1 -3] 5 3 6 7 3 1 3 [-1 -3原创 2021-03-10 20:31:49 · 127 阅读 · 0 评论 -
剑指 Offer 16. 数值的整数次方(C++) 快速幂(二进制角度)
注意:本题与主站 50 题相同:https://leetcode-cn.com/problems/powx-n/解题思路:class Solution {public: double myPow(double x, int n) { bool flag = false; long long N = n;//赋值n if (N == 0) return 1;//0次方 if (N < 0) flag = tru...原创 2021-03-10 20:15:29 · 85 阅读 · 0 评论 -
剑指 Offer 10- II. 青蛙跳台阶问题(C++) 动态规划
一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。示例 1:输入:n = 2输出:2示例 2:输入:n = 7输出:21示例 3:输入:n = 0输出:1提示:0 <= n <= 100注意:本题与主站 70 题相同:https://leetcode-cn.com/problems/climbing-stairs/原创 2021-03-10 19:45:06 · 254 阅读 · 0 评论 -
剑指 Offer 10- I. 斐波那契数列(C++) 动态规划
写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下:F(0) = 0, F(1) = 1F(N) = F(N - 1) + F(N - 2), 其中 N > 1.斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。示例 1:输入:n = 2输出:1示例 2:输入:n = 5输出:5提原创 2021-03-10 19:32:18 · 216 阅读 · 0 评论 -
剑指 Offer 12. 矩阵中的路径(C++) 回溯
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。例如,在下面的3×4的矩阵中包含一条字符串“bfce”的路径(路径中的字母用加粗标出)。但矩阵中不包含字符串“abfb”的路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入这个格子。示例 1:输入:board = [["A","B","C","E"],["S原创 2021-03-10 18:52:14 · 156 阅读 · 0 评论 -
剑指 Offer 68 - I. 二叉搜索树的最近公共祖先(C++) 迭代
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]示例 1:输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8输出: 6 解释: 节点 2原创 2021-03-08 18:45:09 · 171 阅读 · 0 评论 -
剑指 Offer 68 - II. 二叉树的最近公共祖先(C++) 后序遍历 DFS
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]示例 1:输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1输出: 3解释: 节点 5 和节点 1原创 2021-03-08 18:45:40 · 153 阅读 · 0 评论 -
剑指 Offer 55 - II. 平衡二叉树(C++) 后序遍历 + 剪枝
输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。示例 1:给定二叉树 [3,9,20,null,null,15,7] 3 / \ 9 20 / \ 15 7返回 true 。示例 2:给定二叉树 [1,2,2,3,3,null,null,4,4] 1 / \ 2 2 / \ 3 3 / \ 4 4返回 f原创 2021-03-08 18:46:28 · 108 阅读 · 0 评论 -
剑指 Offer 37. 序列化二叉树(C++) 广度优先 + 迭代法
请实现两个函数,分别用来序列化和反序列化二叉树。示例:你可以将以下二叉树: 1 / \ 2 3 / \ 4 5序列化为 "[1,2,3,null,null,4,5]"注意:本题与主站 297 题相同:https://leetcode-cn.com/problems/serialize-and-deserialize-binary-tree/思路:广度优先 + 迭代法。其实题目的意思就是写一个函数将二叉树转成字符串(字符串的形式随你定,可以是题目所原创 2021-03-08 18:46:36 · 88 阅读 · 0 评论 -
剑指 Offer 55 - I. 二叉树的深度(C++) DFS or BFS
输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。例如:给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回它的最大深度 3 。提示:节点总数 <= 10000注意:本题与主站 104 题相同:https://leetcode-cn.com/problems/maximum-depth-of-binary-tree/原创 2021-03-08 18:46:44 · 104 阅读 · 0 评论 -
剑指 Offer 54. 二叉搜索树的第k大节点(C++) 中序遍历的倒序 为 “右、根、左” 顺序
给定一棵二叉搜索树,请找出其中第k大的节点。示例 1:输入: root = [3,1,4,null,2], k = 1 3 / \ 1 4 \ 2输出: 4示例 2:输入: root = [5,3,6,2,4,null,null,1], k = 3 5 / \ 3 6 / \ 2 4 / 1输出: 4限制:1 ≤ k ≤ 二叉搜索树元素个数解题思路:本文解法基于此性质:二叉搜索树的中序遍原创 2021-03-08 18:46:54 · 150 阅读 · 0 评论 -
剑指 Offer 34. 二叉树中和为某一值的路径(C++) 回溯法+先序遍历
输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。示例:给定如下二叉树,以及目标和 sum = 22, 5 / \ 4 8 / / \ 11 13 4 / \ / \7 2 5 1返回:[ [5,4,11,2], [5,8,4,5]] 提示:节点总数 <= 10000注意:本题与主站 113 题相同:https原创 2021-03-06 16:58:28 · 166 阅读 · 0 评论 -
剑指 Offer 32 - III. 从上到下打印二叉树 III(C++) 层序遍历 + 双端队列(奇偶层逻辑分离)前取后放,后取前放
请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。例如:给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回其层次遍历结果:[ [3], [20,9], [15,7]]提示:节点总数 <= 1000解题思路奇偶层的打印顺序不一样是相反的,可以利用层数偶数与否调用revers原创 2021-03-06 16:05:53 · 153 阅读 · 0 评论