小白剑指offer冲冲冲
柳岸残雨
小白
展开
-
剑指offer12,矩阵中的路径 冲鸭
给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。例如,在下面的 3×4 的矩阵中包含单词 “ABCCED”(单词中的字母已标出)。示例输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E",原创 2021-09-07 20:05:58 · 60 阅读 · 0 评论 -
剑指 Offer 13. 机器人的运动范围 好几天没有发CSDN了
地上有一个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。请问该机器人能够到达多少个格子解:深度优先:class Solution {public: int movingCoun原创 2021-08-23 08:48:28 · 66 阅读 · 0 评论 -
leetcode 93. 复原 IP 地址 刷了一天,忘了整理回溯法了
强烈安利一名大佬:代码随想录链接如下代码随想录给定一个只包含数字的字符串,用以表示一个 IP 地址,返回所有可能从 s 获得的 有效 IP 地址 。你可以按任何顺序返回答案。有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 ‘.’ 分隔。例如:“0.1.2.201” 和 “192.168.1.1” 是 有效 IP 地址,但是 “0.011.255.245”、“192.168.1.312” 和 “192.168@1.1” 是 无效 IP 地址。原创 2021-08-15 22:33:36 · 63 阅读 · 1 评论 -
剑指offer 50 字符流中第一个不重复的字符
描述请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。后台会用以下方式调用Insert 和 FirstAppearingOnce 函数string caseout = “”;1.读入测试用例字符串casein2.如果对应语言有Init()函数的话,执行Init() 函数3.循环遍历字符串里的每一个字符ch {Insert(ch);c原创 2021-08-14 11:26:45 · 91 阅读 · 1 评论 -
剑指offer 28 对称的二叉树 小白冲鸭冲
描述请实现一个函数,用来判断一棵二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。示例1输入:{8,6,6,5,7,7,5}返回值:trueclass Solution {public: bool isSymmetrical(TreeNode* pRoot) { if(!pRoot) { return 1; } return twoSymmetrical(pRoot -> l原创 2021-08-14 09:57:55 · 59 阅读 · 1 评论 -
剑指offer32 从上到下打印二叉树
**从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。例如:给定二叉树: [3,9,20,null,null,15,7],3/ 9 20/ 15 7返回其层次遍历结果:[[3],[9,20],[15,7]]**解:/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) :原创 2021-08-14 09:42:42 · 78 阅读 · 2 评论 -
剑指offer57 和为S的连续正数序列 最后冲出一道题,冲完回宿舍
**输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。示例 1:输入:target = 9输出:[[2,3,4],[4,5]]示例 2:输入:target = 15输出:[[1,2,3,4,5],[4,5,6],[7,8]]**解:直接两个指针构成一个可变长度的数组,注意::1、从1开始2、最小两个数3、做优化:让做指针最大不超过一半(因为连续,超过一半指定不行)class S原创 2021-08-13 22:57:55 · 52 阅读 · 1 评论 -
剑指offer14 剪绳子
刚才谈完了,在当地已经算非常高的了,不过不太想去小地方。。。给你一根长度为 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解释原创 2021-08-13 22:42:16 · 62 阅读 · 1 评论 -
剑指offer57 和为S的两个数字 焦灼中
还莫有轮到我,上帝保佑我 (0.0)描述输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,返回两个数的乘积最小的,如果无法找出这样的数字,返回一个空数组即可。返回值描述:对应每个测试案例,输出两个数,小的先输出。示例1输入:[1,2,4,7,11,15],15返回值:[4,11]注意: 求乘积最小的,就是求最外层,和相同,最外层乘积最小,别被迷惑了,双指针夹逼class Solution {public: vector&原创 2021-08-13 20:50:54 · 62 阅读 · 1 评论 -
剑指offer 65 不用加减乘除做加法
描述写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。示例1输入:1,2返回值:3解:class Solution {public: int add(int a, int b) { if (b == 0) { return a; } //因为不允许用+号,所以求出异或部分和进位部分依然不能用+ 号,所以只能循环到没有 进位 为止, //进位就是在b的位置,所以没原创 2021-08-13 19:59:53 · 62 阅读 · 1 评论 -
剑指offer54 二叉搜索树的第K个节点
描述给定一棵二叉搜索树,请找出其中的第k小的TreeNode结点。示例1输入:{5,3,7,2,4,6,8},3返回值:4说明:按结点数值大小顺序第三小结点的值为4class Solution {public: vector<TreeNode* > array; TreeNode* KthNode(TreeNode* pRoot, int k) { if (k <= 0 || pRoot == nullptr) {原创 2021-08-13 17:30:36 · 69 阅读 · 1 评论 -
剑指offerJZ59 按之字形顺序打印二叉树 小白小白白了又白
给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替)例如:给定二叉树: [3,9,20,null,null,15,7],3/ 9 20/ 15 7返回其层次遍历结果:[[3],[20,9],[15,7]]解:就按层序遍历来,最后来个反转岂不美汁汁class Solution {public: vector<vector<int> > Print(TreeNode* pRoot) {原创 2021-08-13 17:12:18 · 59 阅读 · 1 评论 -
剑指offer66 构建乘积数组
我次奥,竟然说晚上七点开始,就离谱,到我不知道啥时候了都。描述给定一个数组A[0,1,…,n-1],请构建一个数组B[0,1,…,n-1],其中B中的元素B[i]=A[0]A[1]…*A[i-1]A[i+1]…*A[n-1]。不能使用除法。(注意:规定B[0] = A[1] * A[2] * … * A[n-1],B[n-1] = A[0] * A[1] * … * A[n-2];)对于A长度为1的情况,B无意义,故而无法构建,因此该情况不会存在。示例1输入:[1,2,3,4,5]返回值:[原创 2021-08-13 16:31:13 · 69 阅读 · 1 评论 -
剑指offer61 扑克牌顺子 冲冲冲
此时,一位小白正在焦灼的等谈薪,总感觉高不了,(> . <)描述现在有2副扑克牌,从扑克牌中随机五张扑克牌,我们需要来判断一下是不是顺子。有如下规则:A为1,J为11,Q为12,K为13,A不能视为14大、小王为 0,0可以看作任意牌如果给出的五张牌能组成顺子(即这五张牌是连续的)就输出true,否则就输出false。例如:给出数据[6,0,2,0,4]中间的两个0一个看作3,一个看作5 。即:[6,3,2,5,4]这样这五张牌在[2,6]区间连续,输出true数据保证每组原创 2021-08-13 15:46:51 · 64 阅读 · 1 评论 -
剑指offer23 链表中环的入口节点(哈希表、双指针)
给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意,pos 仅仅是用于标识环的情况,并不会作为参数传递到函数中。说明:不允许修改给定的链表。进阶:你是否可以使用 O(1) 空间解决此题?解法一:哈希表永远滴神!用个哈希表记录每个节点出现的次数,那个先是2,那个就是节点。class Solution {public:原创 2021-08-13 10:44:30 · 76 阅读 · 1 评论 -
剑指offer64: 求1+2+3+....+n
求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。示例1输入:5返回值:15解:K神奇思妙想,是真的厉害啊,看链接精华部分:class Solution {public: int Sum_Solution(int n) { (n > 1) && (n += Sum_Solution(n - 1)); return n; }};`转载 2021-08-12 21:39:56 · 53 阅读 · 1 评论 -
剑指offer JZ39 平衡二叉树
描述输入一棵二叉树,判断该二叉树是否是平衡二叉树。在这里,我们只需要考虑其平衡性,不需要考虑其是不是排序二叉树平衡二叉树(Balanced Binary Tree),具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。注:我们约定空树是平衡二叉树。class Solution {public: bool IsBalanced_Solution(TreeNode* pRoot) { if (recur(pRoot) ==原创 2021-08-12 21:08:43 · 77 阅读 · 1 评论 -
剑指offer 数组中只出现一次的两个数字
心有点乱了,感觉自己还有这么多没有做。稳住描述一个整型数组里除了两个数字只出现一次,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。示例1输入:[1,4,1,6]返回值:[4,6]class Solution {public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param array int整型vector * @return int整型vector原创 2021-08-12 20:33:09 · 90 阅读 · 1 评论 -
剑指offer 49 丑数
描述把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。示例1输入:7返回值:8解:k神解的,k神牛逼付上评论一个很好的解析:我的一点理解: 在已有的丑数序列上每一个数都必须乘2, 乘3, 乘5, 这样才不会漏掉某些丑数。假设已有的丑数序列为[1, 2, 3, …, n1, n2], 如果单纯的让每个丑数乘2, 乘3, 乘5顺序排列的话肯定会有问题,比如如果转载 2021-08-12 16:35:41 · 64 阅读 · 1 评论 -
剑指offer 两个链表的第一个公共结点
描述输入两个无环的单链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)示例1输入:{1,2,3},{4,5},{6,7}返回值:{6,7}说明:第一个参数{1,2,3}代表是第一个链表非公共部分,第二个参数{4,5}代表是第二个链表非公共部分,最后的{6,7}表示的是2个链表的公共部分这3个参数最后在后台会组装成为2个两个无环的单链表,且是有公共节点的示例2输入:{1},{2,3},{}返回值:{}说明:原创 2021-08-12 14:28:17 · 81 阅读 · 1 评论 -
剑指offer35 复杂链表的复制 做吐了
示例:输入:{1,2,3,4,5,3,5,#,2,#}输出:{1,2,3,4,5,3,5,#,2,#}解析:我们将链表分为两段,前半部分{1,2,3,4,5}为ListNode,后半部分{3,5,#,2,#}是随机指针域表示。以上示例前半部分可以表示链表为的ListNode:1->2->3->4->5后半部分,3,5,#,2,#分别的表示为1的位置指向3,2的位置指向5,3的位置指向null,4的位置指向2,5的位置指向null如下图:class Solution .原创 2021-08-12 10:57:19 · 60 阅读 · 1 评论 -
剑指offer55 二叉树的深度 捏软柿子
快走的时候捏软柿子,现在软柿子捏的越爽,后面硬骨头啃得越难。嘤嘤嘤输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。示例1输入:{1,2,3,4,5,#,6,#,#,7}返回值:4class Solution {public: int TreeDepth(TreeNode* pRoot) { if (!pRoot) { return 0; }原创 2021-08-12 09:00:50 · 55 阅读 · 1 评论 -
剑指offer 50 第一个只出现一次的字符
描述在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).(从0开始计数)示例1输入:“google”返回值:4解:总是快走的时候找个软柿子捏。哈希表,永远滴神class Solution {public: int FirstNotRepeatingChar(string str) { unordered_map<char, int> hash原创 2021-08-11 22:39:59 · 52 阅读 · 1 评论 -
剑指offer42 连续子数组的最大和
描述输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为 O(n).示例1输入:[1,-2,3,10,-4,7,2,-5]复制返回值:18复制说明:输入的数组为{1,-2,3,10,—4,7,2,一5},和最大的子数组为{3,10,一4,7,2},因此输出为该子数组的和 18。解:用双指针反而麻烦,就用一个node点来维护就好了class Solution {public: int FindGreat原创 2021-08-11 22:26:25 · 68 阅读 · 1 评论 -
剑指offer33 二叉搜索树的后序遍历序列
描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。(ps:我们约定空树不是二叉搜索树)示例1输入:[4,8,6,12,16,14,10]返回值:true主要是找到左子树和右子树的分界点,多加一个判断右子树有没有小于根节点的操作。class Solution {public: bool VerifySquenceOfBST(vector<int> sequence) {原创 2021-08-11 21:31:03 · 69 阅读 · 1 评论 -
剑指offer 29 顺时针打印矩阵 小白冲鸭冲
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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]解:刚才实验室的人做测评,看了看去,进度好慢我,还是要加油啊```cppclass Solution {public: vector<int> printMatrix(vector&原创 2021-08-11 20:53:31 · 82 阅读 · 1 评论 -
剑指offer39 数组中出现次数超过一半的数字(三种方案) 找个软柿子捏一捏
描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组[1,2,3,2,2,2,5,4,2]。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。你可以假设数组是非空的,并且给定的数组总是存在多数元素。1<=数组长度<=50000,0<=数组元素<=10000方法一:sort排序,取中间class Solution {public: int MoreThanHalfNum_Solution(vector<int&原创 2021-08-11 17:55:44 · 73 阅读 · 0 评论 -
剑指offer26 树的子结构 (两种解法)
描述输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)示例1给定的树 A: 3/ \4 5/ 1 2给定的树 B:4/1返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。思路:**核心内容:设置辅助函数isequal,判断根节点相同的两个树A,B,B是不是属于A的子结构。这样的话,遍历一遍题目中第一个二叉树,每个节点都调用一次辅助函数isequal判断一下就好了,遍历结束如果没有return 1,就说明不是子原创 2021-08-11 17:19:11 · 59 阅读 · 1 评论 -
剑指offer32 从上往下打印二叉树
描述从上往下打印出二叉树的每个节点,同层节点从左至右打印。示例1输入:{5,4,#,3,#,2,#,1}返回值:[5,4,3,2,1]这种打印二叉树的,就用一个队列存放节点,如果还要分层打印的话,就记录每一层的节点数目n,从队列中取出n个节点的值,放入容器vector一显示即可。class Solution {public: vector<int> PrintFromTopToBottom(TreeNode* root) { vector<int&原创 2021-08-11 16:19:44 · 68 阅读 · 1 评论 -
剑指offer31 栈的压入、弹出序列
描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)示例1输入:[1,2,3,4,5],[4,3,5,1,2]返回值:falseclass Solution {public: bool IsPopOrder(vector<int原创 2021-08-11 15:44:52 · 93 阅读 · 1 评论 -
剑指offer 30 包含min函数的栈
描述定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数,并且调用 min函数、push函数 及 pop函数 的时间复杂度都是 O(1)push(value):将value压入栈中pop():弹出栈顶元素top():获取栈顶元素min():获取栈中最小元素示例:输入: [“PSH-1”,“PSH2”,“MIN”,“TOP”,“POP”,“PSH1”,“TOP”,“MIN”]输出: -1,2,1,-1解析:"PSH-1"表示将-1压入栈中,栈中元素为-1原创 2021-08-11 15:01:42 · 55 阅读 · 1 评论 -
剑指offer22 链表中倒数最后k个结点
描述输入一个链表,输出一个链表,该输出链表包含原链表中从倒数第k个结点至尾节点的全部节点。如果该链表长度小于k,请返回一个长度为 0 的链表。示例1输入:{1,2,3,4,5},1返回值:{5}解:双指针鸭,先让快指针往前跑K,慢指针再跑。 ListNode* FindKthToTail(ListNode* pHead, int k) { // write code here ListNode* first = pHead; Lis原创 2021-08-10 22:27:07 · 102 阅读 · 1 评论 -
剑指offer21 调整数组顺序使奇数位于偶数前面 三种方法 冲冲冲
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。示例1输入:[1,2,3,4]返回值:[1,3,2,4]解:如果非得相对位置不变采用笨方法: vector<int> reOrderArray(vector<int>& array) { // write code here vector<int>原创 2021-08-10 22:09:05 · 80 阅读 · 1 评论 -
剑指offer 16 数值的整数次方
**描述给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。保证base和exponent不同时为0。不得使用库函数,同时不需要考虑大数问题,也不用考虑小数点后面0的位数。**不多BB,笨法子来一套class Solution {public: double Power(double base, int exponent) { if (base == 0) { return 0;原创 2021-08-10 21:12:15 · 64 阅读 · 1 评论 -
剑指offer15 二进制中1的个数 (冲冲)
描述输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。示例1输入:10返回值:2分析:class Solution {public: int NumberOf1(int n) { int count1 = 0; while (n) { n &= (n - 1); count1 ++; } return count1;原创 2021-08-10 20:48:33 · 55 阅读 · 1 评论 -
剑指offer25 合并两个排序的链表
描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。示例1输入:{1,3,5},{2,4,6}返回值:{1,2,3,4,5,6}解法一:谁小指谁class Solution {public: ListNode* Merge(ListNode* pHead1, ListNode* pHead2) { if (pHead1 == nullptr) { return pHead2; }原创 2021-08-10 20:33:41 · 51 阅读 · 1 评论 -
剑指offer10 斐波那契数列(递归、迭代、记忆化、数组四种方法)
描述大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)。n\leq 39n≤39示例1输入:4复制返回值:31、递归:效率低下class Solution {public: int Fibonacci(int n) { if (n == 0) { return 0; } if (n == 1) { return 1;原创 2021-08-10 17:20:15 · 124 阅读 · 2 评论 -
剑指offer11 旋转数组的最小数字
描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。示例1输入:[3,4,5,1,2]复制返回值:1二分法得多加练习鸭class Solution {public: int minNumberInRotateArray(vector<int> rotateArray) { if (rotateArray.size原创 2021-08-10 16:32:05 · 55 阅读 · 2 评论 -
剑指offer09 用两个栈实现队列
描述用两个栈来实现一个队列,分别完成在队列尾部插入整数(push)和在队列头部删除整数(pop)的功能。 队列中的元素为int类型。保证操作合法,即保证pop操作时队列内已有元素。示例:输入:[“PSH1”,“PSH2”,“POP”,“POP”]返回:1,2解析:“PSH1”:代表将1插入队列尾部“PSH2”:代表将2插入队列尾部"POP“:代表删除一个元素,先进先出=>返回1"POP“:代表删除一个元素,先进先出=>返回2示例1输入:[“PSH1”,“PSH2”,“原创 2021-08-10 15:51:16 · 95 阅读 · 2 评论 -
剑指offer06 重建二叉树
给定某二叉树的前序遍历和中序遍历,请重建出该二叉树并返回它的头结点。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出如下图所示。提示:1.0 <= pre.length <= 20002.vin.length == pre.length3.-10000 <= pre[i], vin[i] <= 100004.pre 和 vin 均无重复元素5.vin出现的元素均出现在 pre里6.只需要返回根结点,系统原创 2021-08-10 15:36:13 · 75 阅读 · 2 评论