自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 剑指offer面试题39:数组中出现次数超过一半的数字

题目描述:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。你可以假设数组是非空的,并且给定的数组总是存在多数元素。示例 1: 输入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 输出: 2本题常见的三种解法:哈希表统计法: 遍历数组 nums ,用 HashMap 统计各数字的数量,即可找出 众数 。此方法时间和空间复杂度均为 O(N)O(N) 。数组排序法: 将数组 nums 排序,数组中点的元素 一定为众数。摩尔投票法: 核心理念为 票数正负抵消 。此方法...

2022-05-18 17:40:38 174

原创 剑指offer面试题38:字符串的排列

题目描述:输入一个字符串,打印出该字符串中字符的所有排列。你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。示例: 输入:s = "abc" 输出:["abc","acb","bac","bca","cab","cba"]1、使用C++ next_permutation()全排列函数class Solution {public: vector<string> permutation(string s) { sort(s.begin(.

2022-05-18 16:34:45 457

原创 剑指offer面试题37:序列化二叉树

题目描述:请实现两个函数,分别用来序列化和反序列化二叉树。你需要设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。示例:输入:root = [1,2,3,null,null,4,5] 输出:[1,2,3,null,null,4,5]C++引入了ostringstream、istringstream、stringstream这三个类,要使用他们创建对象就必须包含&

2022-05-17 17:01:34 249

原创 剑指offer面试题36:二叉搜索树与双向链表

题目描述:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。什么是二叉搜索树 ?二叉搜索树是一棵有序的二叉树,所以我们也可以称它为二叉排序树。具有以下性质的二叉树我们称之为二叉搜索树:若它的左子树不为空,那么左子树上的所有值均小于它的根节点;若它的右子树不为空,那么右子树上所有值均大于它的根节点。它的左子树和右子树分别也为二叉搜索树。二叉搜索树的中序遍历是:左=>根=>右; 二叉搜索树的中序遍历从小到大是有序的。

2022-05-13 21:54:01 241

原创 剑指offer面试题35:复杂链表的复制

题目描述:请实现 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

2022-05-13 17:48:25 105

原创 剑指offer面试题34:二叉树中和为某一值的路径

题目描述:给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。叶子节点 是指没有子节点的节点。方法一:深度优先搜索思路及算法我们可以采用深度优先搜索的方式,枚举每一条从根节点到叶子节点的路径。当我们遍历到叶子节点,且此时路径和恰为目标和时,我们就找到了一条满足条件的路径。解题思路:本问题是典型的二叉树方案搜索问题,使用回溯法解决,其包含先序遍历 + 路径记录两部分。先序遍历: 按照 “根、左、右”..

2022-05-13 11:04:59 259

原创 剑指offer面试题33:二叉树的后序遍历序列

题目描述:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。示例 1:输入: [1,6,3,2,5] 输出: false示例 2:输入: [1,3,2,6,5] 输出: true解题思路:后序遍历定义: [ 左子树 | 右子树 | 根节点 ] ,即遍历顺序为 “左、右、根” 。二叉搜索树定义: 左子树中所有节点的值 <根节点的值;右子树中所有节点的值 >根节点的值...

2022-05-12 15:25:23 262

原创 剑指offer面试题32-III:从上到下打印二叉树

题目描述:请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。层序遍历 + 倒序思路分析I. 按层打印: 题目要求的二叉树的 从上至下 打印(即按层打印),又称为二叉树的 广度优先搜索(BFS)。BFS 通常借助 队列 的先入先出特性来实现。II. 每层打印到一行: 将本层全部节点打印到一行,并将下一层全部节点加入队列,以此类推,即可分为多行打印。III. 每层打印到一行: 将本层全部节点打印.

2022-05-09 17:44:59 268

原创 剑指offer面试题32-II从上到下打印二叉树(层序遍历)

题目描述:从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。思路分析I. 按层打印: 题目要求的二叉树的 从上至下 打印(即按层打印),又称为二叉树的 广度优先搜索(BFS)。BFS 通常借助 队列 的先入先出特性来实现。II. 每层打印到一行: 将本层全部节点打印到一行,并将下一层全部节点加入队列,以此类推,即可分为多行打印。算法流程1、特例处理: 当根节点为空,则返回空列表 [] ;2、初始化: 打印结果列表 res = [] ,包含根节点的队列 queue =.

2022-05-09 16:26:32 187

原创 剑指offer面试题32-I:从上到下打印二叉树(层序遍历)

题目描述:从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。解题思路:题目要求的二叉树的从上至下打印(即按层打印),又称为二叉树的广度优先搜索(BFS)。 BFS 通常借助队列的先入先出特性来实现。算法流程:1、特例处理: 当树的根节点为空,则直接返回空列表 [] ;2、初始化: 打印结果列表 res = [] ,包含根节点的队列 queue = [root] ;3、BFS 循环: 当队列 queue 为空时跳出; (1)出队: 队首元素出队,记为 no...

2022-05-09 11:06:16 209

原创 剑指offer面试题:栈的压入、弹出序列

解题思路使用辅助栈 sta 来模拟 压入push/弹出pop操作的排列关键逻辑入栈操作: 按照压栈序列的顺序执行。出栈操作: 每次入栈后,循环判断 “栈顶元素 === 弹出序列的当前元素” 是否成立,将符合弹出序列顺序的栈顶元素全部弹出。算法流程:1、使用辅助栈 sta, 并且把弹出序列中的第一个弹出的元素下标为 cur = 02、遍历操作:元素入栈,判断辅助栈的栈顶与弹出序列当前指针对应的元素是否相同3、如果相同,则弹出该元素,并把当前元素的下一元素设为当前元素,即.++ cur,重

2022-05-07 17:48:54 258

原创 剑值offer面试题30:包含main函数的栈

题目描述:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。示例:MinStack minStack = new MinStack();minStack.push(-2);minStack.push(0);minStack.push(-3);minStack.min(); --> 返回 -3.minStack.pop();minStack.top(); --> 返回...

2022-05-07 15:59:17 108

原创 剑指offer面试题29:顺时针打印矩阵

题目描述:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。示例 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]题目解析将矩阵按顺时针从外到内打印一次最外层的“外壳”,将最外层的所有数值打印一次,直到矩阵所有数...

2022-05-07 10:18:32 200

原创 剑指offer面试题28:对称的二叉树

题目描述:请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。示例 1: 输入:root = [1,2,2,3,4,4,3] 输出:true示例 2: 输入:root = [1,2,2,null,3,null,3] 输出:false解题思路:对称二叉树定义: 对于树中 任意两个对称节点 L和 R,一定有:L->val = R->val:即此两对称节点值相等。L->left->va...

2022-05-06 19:52:03 200

原创 剑指offer面试题27:二叉树的镜像

方法一:递归法根据二叉树镜像的定义,考虑递归遍历(dfs)二叉树,交换每个节点的左 / 右子节点,即可生成二叉树的镜像。递归解析:1、终止条件: 当节点 rootroot 为空时(即越过叶节点),则返回 nullnull ;2、递推工作: 1、初始化节点 tmp ,用于暂存 root 的左子节点; 2、开启递归 右子节点 mirrorTree(root->right) ,并将返回值作为 root 的 左子节点 。 3、开启递归 左子节点 mirrorTr...

2022-05-05 22:08:10 347

原创 剑指offer面试题26:树的子结构

题目描述:输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构) B是A的子结构, 即 A中有出现和B相同的结构和节点值。示例 1: 输入:A = [1,2,3], B = [3,1] 输出:false示例 2: 输入:A = [3,4,5,1,2], B = [4,1] 输出:true解题思路:若树 B是树 A的子结构,则子结构的根节点可能为树 A的任意一个节点。因此,判断树 B是否是树 A的子结构,需完成以下两步工作:1、先序遍历树...

2022-05-05 16:38:40 302

原创 剑指offer面试题25:合并两个排序的链表

题目描述:输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。示例1: 输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4思路一:迭代1、设置 res 为哑结点,放置于新链表之前,最后返回的就是 res->next ;设置 p 为当前节点,从 res 开始。2、当两个链表都非空时进入循环,令新链表的下一个节点 p->next 为 val 更小的节点,相应的链表节点...

2022-05-05 11:46:16 932

原创 剑指offer面试题24:反转链表

题目描述:给定单链表的头节点 head ,请反转链表,并返回反转后的链表的头节点。示例 1: 输入:head = [1,2,3,4,5] 输出:[5,4,3,2,1]示例 2: 输入:head = [1,2] 输出:[2,1]class Solution {public: ListNode* reverseList(ListNode* head) { vector<int> reList; /...

2022-05-05 10:42:52 300

原创 剑指offer面试题22:链表中倒数第k个节点

方法一:顺序遍历(遍历两次)思路与算法:最简单直接的方法即为顺序查找,假设当前链表的长度为 count,则我们知道链表的倒数第 k个节点即为正数第 count−k 个节点,此时我们只需要顺序遍历到链表的第 count- k 个节点即为倒数第 k个节点。1、先遍历一遍链表,每遍历一个节点,计数器 +1,遍历整个链表得到链表长度 count2、倒数第 k 个节点就是顺序遍历的第 count- k + 1 个节点3、再次遍历链表,找到第 count- k + 1 个节点,返回该节点cla...

2022-05-04 20:19:51 270

原创 剑指offer面试题21:调整数组顺序使奇数位于偶数前面

题目描述:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数在数组的前半部分,所有偶数在数组的后半部分。示例: 输入:nums =[1,2,3,4] 输出:[1,3,2,4] 注:[3,1,2,4] 也是正确的答案之一。class Solution {public: vector<int> exchange(vector<int>& nums) { int len = nums.size(); ...

2022-05-04 17:43:23 803

原创 剑指offer面试题20:表示数值的字符串

题目描述:请实现一个函数用来判断字符串是否表示数值(包括整数和小数)数值(按顺序)可以分成以下几个部分:1、若干空格2、一个小数或者整数3、(可选)一个'e'或'E',后面跟着一个整数4、若干空格小数(按顺序)可以分成以下几个部分:1、(可选)一个符号字符('+' 或 '-')2、下述格式之一: 至少一位数字,后面跟着一个点 '.' 至少一位数字,后面跟着一个点 '.' ,后面再跟着至少一位数字 ...

2022-05-04 16:41:32 278

原创 剑指offer面试题18:删除链表的节点

题目描述:给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。示例 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的第三个...

2022-05-04 11:16:34 61

原创 剑指offer面试题17:打印从1到最大的n位数

题目描述:输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。示例 1: 输入: n = 1 输出: [1,2,3,4,5,6,7,8,9]class Solution {public: vector<int> printNumbers(int n) { vector<int> nums; long long m_num = ...

2022-05-04 10:08:33 178

原创 剑指offer面试题16:数值的整数次方

题目描述:实现pow(x,n),即计算 x 的 n 次幂函数(即,x^n)。不得使用库函数,同时不需要考虑大数问题。示例 1:输入:x = 2.00000, n = 10 输出:1024.00000示例 2:输入:x = 2.10000, n = 3 输出:9.26100示例 3:输入:x = 2.00000, n = -2 输出:0.25000 解释:2^-2 = 1/2^2 = 1/4 = 0.25使用递归的方法: ...

2022-05-03 15:40:21 864

原创 剑指offer面试题15:二进制中1的个数

题目描述:编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '1' 的个数(也被称为汉明重量))。示例 1:输入:n = 11 (控制台输入 00000000000000000000000000001011) 输出:3解释:输入的二进制串 00000000000000000000000000001011中,共有三位为 '1'。示例 2:输入:n = 128 (控制台输入 00000000000000000000000010000000) 输出:1...

2022-04-30 17:47:37 633

原创 剑指offer面试题14-I:剪绳子

思路一:贪心算法推论一: 将绳子 以相等的长度等分为多段 ,得到的乘积最大。推论二: 尽可能将绳子以长度 33 等分为多段时,乘积最大。核心思路是:尽可能把绳子分成长度为3的小段,这样乘积最大。步骤如下:(1)如果 n === 4,返回4(2)如果 n > 4,分成尽可能多的长度为3的小段,每次循环长度n减去3,乘积res乘以3;最后返 回时乘以小于等于4的最后一小段class Solution {public: int cuttingRop...

2022-04-30 16:08:54 544

原创 剑指offer面试题13:机器人的运动范围

题目描述:地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人能够到达多少个格子?示例 1:输入:m = 2, n = 3, k = 1 输出:3示例 2:输入...

2022-04-28 17:32:14 406

原创 剑值offer面试题12:矩阵中的路径

题目描述:给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。示例 1:输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"输出:true示例

2022-04-27 17:32:13 122

原创 剑值offer面试题11:旋转数组的最小数字

题目描述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。给你一个可能存在 重复 元素值的数组 numbers ,它原来是一个升序排列的数组,并按上述情形进行了一次旋转。请返回旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一次旋转,该数组的最小值为 1。示例 1:输入:numbers = [3,4,5,1,2] 输出:1示例 2:输入:numbers = [2,2,2,0,1] 输出:01、冒泡排序class Soluti...

2022-04-27 15:56:09 47

原创 剑道offer10-II:青蛙跳台阶问题

题目描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。示例 1:输入:n = 2 输出:2示例 2:输入:n = 7 输出:21示例 3:输入:n = 0 输出:11、C++动态规划n-1个台阶有f(n-1)种跳法,最后还剩一个台阶,最后青蛙只能最后一跳n-2个台阶有f(n-2)种跳法,最后剩余二个台阶,有两种跳法:...

2022-04-27 11:51:38 225

原创 剑道offer面试题10:斐波那契数列

题目描述:写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下:F(0) = 0, F(1) = 1,F(N) = F(N - 1) + F(N - 2), 其中 N > 1。斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。示例 1:输入:n = 2 输出:1示例 2:输入:n = ...

2022-04-27 11:28:59 943

原创 剑指offer面试题9:用两个栈实现队列

题目描述:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead操作返回 -1 )示例 1:输入:["CQueue","appendTail","deleteHead","deleteHead"][[],[3],[],[]]输出:[null,null,3,-1]示例 2:输入:["CQueue","deleteHead","appendT.

2022-04-19 17:16:37 62

原创 剑指offer面试题7:重建二叉树

题目描述:输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。示例 1:Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]Output: [3,9,20,null,null,15,7]示例 2:Input: preorder = [-1], inorder = [-1]Output: [-1]知识点:前序遍历列表:第一个元素永远是 【根节点 .

2022-04-19 16:36:18 794

原创 剑道offer面试题6:从尾到头打印链表

题目描述:输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。示例 1:输入:head = [1,3,2]输出:[2,3,1]1、单向链表,先遍历一次链表,记录链表长度,再进行一次遍历,将链表中的数据存储在数组中。(也可以只遍历一次链表,遍历时存入数组中)/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * .

2022-04-18 21:49:08 45

原创 剑值offer面试题5:替换空格

题目描述:请实现一个函数,把字符串 s 中的每个空格替换成"%20"。示例 1:输入:s = "We are happy."输出:"We%20are%20happy."1、首先扩充数组到每个空格替换成"%20"之后的大小。然后从后向前替换空格,也就是双指针法,过程如下:i指向新长度的末尾,j指向旧长度的末尾。时间复杂度:O(n) 空间复杂度:O(1)class Solution {public: string replaceSpace(string s) { ...

2022-04-18 20:58:38 142

原创 剑道offer面试题4:二维数组中的查找

题目描述:在一个 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]]给定 targe......

2022-04-18 17:28:14 649

原创 剑道offer面试题3:数组中重复的数字

题目描述:在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。示例 1:输入:[2, 3, 1, 0, 2, 5, 3]输出:2 或 3c++ 方法1: 直接使用hash表 存储是否出现过 复杂度 O(N) 空间 O(N) int findRepeatNumber(vector<int>& nums) {

2022-04-18 16:58:11 292

空空如也

空空如也

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

TA关注的人

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