自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(25)
  • 收藏
  • 关注

原创 [剑指Offer]:二叉搜索树的第k大节点

文章目录题目描述题解思路方法一:递归方法二:非递归题目描述给定一棵二叉搜索树,请找出其中第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题解思路方法一:递归一般情况的中序

2021-01-31 23:40:29 126

原创 [剑指Offer]:0~n-1中缺失的数字

文章目录题目描述题解思路方法一:暴力搜索方法二:二分法题目描述一个长度为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题解思路方法一:暴力搜索复杂度分析时间复杂度 O(N)O(N)O(N)空间复杂度 O(1)O(1)O(1): 几个变量使用常数大小的额外空间。

2021-01-31 20:44:13 122

原创 [剑指Offer]:在排序数组中查找数字

文章目录题目描述题解思路方法一:遍历数组方法二:hashmap方法三:利用函数 lower_bound 与 upper_bound方法四:二分法题目描述统计一个数字在排序数组中出现的次数。示例 1:输入: nums = [5,7,7,8,8,10], target = 8输出: 2示例 2:输入: nums = [5,7,7,8,8,10], target = 6输出: 0题解思路方法一:遍历数组思路不讲武德。代码实现:class Solution {public:

2021-01-30 16:24:23 135

原创 [剑指Offer]:数组中的逆序对

文章目录题目描述题解思路方法一:暴力解法(超时)方法二:归并排序 方法三:散化树状数组(未掌握)题目描述在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。示例 1:输入: [7,5,6,4]输出: 5题解思路方法一:暴力解法(超时)使用两层 for 循环枚举所有的数对,逐一判断是否构成逆序关系。复杂度分析:时间复杂度:O(N2)O(N^2)O(N2),这里 N 是数组的长度;空间复杂度:O(1)O(1)O(

2021-01-29 23:52:39 227

原创 [剑指Offer]:丑数

文章目录题目描述题解思路方法一:原始思路方法二:动态规划题目描述我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。示例:输入: n = 10输出: 12解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。说明: 1 是丑数。n 不超过1690。题解思路方法一:原始思路逐个判断每个数是不是丑数,直到丑数的数量达到 n。该方法会超时!!!class Solution {publ

2021-01-28 23:08:01 116 1

原创 C++ 和 Java 的区别和联系

文章目录提问:通常,我们聊到Java,第一印象“面向对象”,“没有指针,编写效率高,执行效率较低”。更深入、专业一点就谈论 “Java内存自动回收(GC垃圾回收机制),多线程编程”。Java的三大特性是封装、继承和多态。Java 与 C++ 的区别?尽管 Java 是基于 C++ 的,但是相比之下,Java 是一种更纯粹的面向对象程序设计语言。在 Java 中,一切都被视为对象。C++ 是在 C 语言的基础上开发的一种面向对象编程语言,C++ 完全兼容 C 语言。(C语言是面向过程语言,而C+

2021-01-28 11:43:17 312

原创 [剑指Offer]:最长不含重复字符的子字符串

文章目录题目描述题解思路方法一:滑动窗口方法二:优化的滑动窗口(哈希表)方法三:哈希表题目描述请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。示例 1:输入: "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例 2:输入: "bbbbb"输出: 1解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。示例 3:输入: "pwwkew"输出: 3解释: 因为无重复字符的最长子串是 "wk

2021-01-27 23:20:19 116

原创 [剑指Offer]:礼物的最大价值(动态规划)

文章目录题目描述题解思路 -- 动态规划方法一:创建辅助数组方法二:不创建辅助数组题目描述在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?示例 1:输入: [ [1,3,1], [1,5,1], [4,2,1]]输出: 12解释: 路径 1→3→5→2→1 可以拿到最多价值的礼物题

2021-01-26 22:40:33 153

原创 [剑指Offer]:把数字翻译成字符串(动态规划、递归)

文章目录题目描述题解思路方法一:动态规划方法二:递归题目描述给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。示例 1:输入: 12258输出: 5解释: 12258有5种不同的翻译,分别是"bccfi", "bwfi", "bczi", "mcfi"和"mzi"题解思路方法一:动态规划代码实现:clas

2021-01-26 16:10:11 97

原创 [剑指Offer]:把数组排成最小的数

文章目录题目描述题解思路题目描述输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。示例 1:输入: [10,2]输出: "102"示例 2:输入: [3,30,34,5,9]输出: "3033459"提示:0 < nums.length <= 100说明:输出结果可能非常大,所以你需要返回一个字符串而不是整数拼接起来的数字可能会有前导 0,最后结果不需要去掉前导 0题解思路不管有多少个数,也不管这些数各自分别是

2021-01-24 20:45:01 96

原创 [剑指Offer]:数字序列中某一位的数字

文章目录题目描述题解思路题目描述数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等。请写一个函数,求任意第n位对应的数字。示例 1:输入:n = 3输出:3示例 2:输入:n = 11输出:0题解思路这道题其实就是找一下规律,同时需要我们细心计算好一些细节,比如位数、余数、索引等。找到 n 属于哪个数位里的索引。比如 n = 5,那 n 就是个位这个数位里的索引;或者

2021-01-22 19:50:04 121

原创 [剑指Offer]:1 ~ n 整数中 1 出现的次数

文章目录题目描述题解思路方法一:硬核解法方法二:找规律方法三:神仙代码题目描述输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。示例 1:输入:n = 12输出:5示例 2:输入:n = 13输出:6题解思路方法一:硬核解法每次对10取模,然后判断个位数是否为1,当n位数大时,时间复杂度也比较高:O(nlogn)。class Solution {public:

2021-01-22 15:21:08 153

原创 [剑指Offer]:数据流中的中位数

文章目录题目描述题解思路题目描述如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。例如,[2,3,4] 的中位数是 3[2,3] 的中位数是 (2 + 3) / 2 = 2.5设计一个支持以下两种操作的数据结构:void addNum(int num) - 从数据流中添加一个整数到数据结构中。double findMedian() - 返回目前所有元素的

2021-01-21 22:02:18 106

原创 [剑指Offer]:字符串的排列(回溯)

文章目录题目描述题解思路题目描述输入一个字符串,打印出该字符串中字符的所有排列。你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。示例:输入:s = "abc"输出:["abc","acb","bac","bca","cab","cba"]题解思路递归回溯假设s = “abc”,那么我们首先让 a 在第 0 位,再让 b 在第 0 位,再让 c 在第 0 位。a 在第 0 位,那么还剩 bc。我们先放 b 在第 1 位,再让 c 在第 1 位。b 在第 1 位,那么还

2021-01-21 09:13:05 131

原创 [剑指Offer]:序列化二叉树

文章目录题目描述题解思路方法一:层序遍历方法二:前序遍历题目描述实现两个函数,分别用来序列化和反序列化二叉树。示例:你可以将以下二叉树: 1 / \ 2 3 / \ 4 5序列化为 "[1,2,3,null,null,4,5]"题解思路方法一:层序遍历序列化就是简单的层序遍历。在反序列化的时候,将字符串解析的过程中将新建的节点存入vector容器。根据节点间的顺序关系,构建连接树结构。代码实现:class Codec {publ

2021-01-20 23:45:15 143

原创 [剑指Offer]:二叉搜索树与双向链表

文章目录题目描述题解思路题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。为了让您更好地理解问题,以下面的二叉搜索树为例:我们希望将这个二叉搜索树转化为双向循环链表。链表中的每个节点都有一个前驱和后继指针。对于双向循环链表,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。下图展示了上面的二叉搜索树转化成的链表。“head” 表示指向链表中有最小元素的节点。特别地,我们希望可以就地完成转换操作。当转化

2021-01-20 11:21:21 94

原创 [剑指Offer]:复杂链表的复制

文章目录题目描述题解思路方法一:哈希表方法二:拼接 + 拆分题目描述请实现 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

2021-01-20 10:40:28 114

原创 [剑指Offer]:二叉搜索树的后序遍历序列

文章目录题目描述题解思路题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。参考以下这颗二叉搜索树: 5 / \ 2 6 / \ 1 3示例 1:输入: [1,6,3,2,5]输出: false示例 2:输入: [1,3,2,6,5]输出: true题解思路二叉搜索树的性质:根节点左侧的所有节点的值一定小于等于根节点的值,根节点右侧的所

2021-01-19 23:00:19 141

原创 [剑指Offer]:顺时针打印矩阵

文章目录题目描述题解思路题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.示例1:输入[[1,2],[3,4]]返回值[1,2,4,3]题解思路class Solution {public: vector<int> printMatrix

2021-01-14 05:57:12 151

原创 [剑指Offer]:对称的二叉树

文章目录题目描述题解思路:递归题目描述请实现一个函数,用来判断一棵二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。示例1:输入{8,6,6,5,7,7,5}返回值true示例2:输入{8,6,9,5,7,7,5}返回值false题解思路:递归设置一个递归函数isSame(r1, r2),表示如果对称,返回true,否则返回false递归终止条件:r1==nullptr && r2==nulllptr; 直接返回tru

2021-01-13 12:17:14 90

原创 [剑指Offer]:树的子结构

文章目录题目描述题解思路:递归题目描述输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)示例1:输入{8,8,#,9,#,2,#,5},{8,9,#,2}返回值true题解思路:递归递归函数的功能:判断2个数是否有相同的结构,如果相同,返回true,否则返回false递归终止条件:如果树B为空,返回true,此时,不管树A是否为空,都为true否则,如果树B不为空,但是树A为空,返回false,此时B还没空但A空了,显然false

2021-01-12 14:57:00 103

原创 [剑指Offer]:合并两个排序的链表

文章目录题目描述解答思路方法一: 递归方法二:题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。示例:输入{1,3,5},{2,4,6}返回值{1,2,3,4,5,6}解答思路方法一: 递归递归函数结束的条件是什么?对于链表就是,如果为空,返回什么递归函数一定是缩小递归区间的,那么下一步的递归区间是什么?跟迭代方法中的一样,如果PHead1的所指节点值小于等于pHead2所指的结点值,那么phead1后续节点和pHea

2021-01-12 13:06:58 125

原创 [剑指Offer]:调整数组顺序使奇数位于偶数前面

文章目录题目描述思路:双指针法题目升级思路:创建辅助数组题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。示例:输入:nums = [1,2,3,4]输出:[1,3,2,4] 注:[3,1,2,4] 也是正确的答案之一。思路:双指针法代码实现:class Solution {public: vector<int> exchange(vector<int>& array)

2021-01-11 11:33:59 117

原创 [剑指Offer]:表示数值的字符串

文章目录题目描述思路题目描述请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。示例1:输入"123.45e+6"返回值true示例2:输入"1.2.3"返回值false思路首先要想到所有的情况,然后进行分类讨论。-123.45e-67± 号后面必定为数字或后面为.(-.12

2021-01-11 09:51:31 96

原创 C++:如何解决迭代器失效问题

文章目录insert 导致的迭代器失效erase 导致的迭代器失效vector总结:insert和eraser操作会使迭代器失效。insert 导致的迭代器失效insert操作在vector中会炸,而在list中不会。 比如下面这个代码运行会直接炸int main() { vector<int> s{ 1,2,3,4,5,6,7,8 }; for (auto i = s.begin(); i != s.end(); ++i) { if (*i

2021-01-07 17:21:37 421 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除