
剑指offer_C++实现
用C++实现剑指offer的所有题目以及解题思路。
给你。
这个作者很懒,什么都没留下…
展开
-
JZ40 最小的K个数
3.书中解题,多重哈希表,哈希表从大到小排序,依次往哈希表插入k个元素,如果哈希表有了k个元素,往后每遍历一个值,把0号元素(最大值)和当前元素进行对比,0号元素比进来的元素小,删除0号元素,插入当前元素。例如数组元素是4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4(任意顺序皆可)。2.维护一个K个节点的大根堆,对于[k,n-1]之间的元素,每次拿堆顶元素和当前元素对比,交。输入:[4,5,1,6,2,7,3,8],4 返回值:[1,2,3,4]原创 2024-08-26 04:12:04 · 331 阅读 · 0 评论 -
JZ13 机器人的运动范围
但是,它不能进入方格 [35,38] ,因为 3+5+3+8 = 19。if thresold = 3, 能走的路径:00 01 02 03,10,11 ,12,20 ,21,30, row+col <=3。if thresold = 8,能走的路径: 00~08, 10~17, 20~26,30~35,40~44, row+col<=8。row = 10, col = 11 ------>数位和:1+0+1+1 = 3。数位和:123456----->1+2+3+4+5+6,原创 2024-08-26 03:31:31 · 473 阅读 · 0 评论 -
JZ12 矩阵中的路径
如果树的叶子节点不满足约束条件,那么只好回溯到它的上一个节点再尝试其他选项,如果上一个节点的所有可能的选项都试过了,并且不能满足约束条件的终结状态,再回溯到上一个节点。如果所有节点的所有选项都已经尝试过仍然不能满足约束条件的终结状态,则该问题无解。剑指Offer --p88。用回溯解决的问题的所有选项可以形象地用树结构表示,在某一步可能有n个可能的选项,那么该步骤可以看成是树状结构中的一个节点,每一个选项看成树中节点连接线,经过这些连接线到达该节点的n个子节点,树的叶子节点对应着终结状态。原创 2024-08-25 17:14:38 · 305 阅读 · 0 评论 -
JZ58 左旋转字符串
例如,字符序列 S = ”abcXYZdef” , 要求输出循环左移 3 位后的结果,即 “XYZdefabc”数据范围:输入的字符串长度满足 0≤len≤100 0≤len≤100 , 0≤n≤100 0≤n≤100。3.对str.begin()至str.end()-n这一区间进行翻转。-------->对fedZYX进行翻转。2.对倒数第n个字符至str.end()这一区间进行翻转------>对cba进行翻转。进阶:空间复杂度 O(n) O(n) ,时间复杂度 O(n) O(n)原创 2024-08-25 01:56:03 · 406 阅读 · 0 评论 -
JZ273 翻转单词序列
牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“nowcoder. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a nowcoder.”。进阶:空间复杂度 O(n) O(n) ,时间复杂度 O(n) O(n) ,保证没有只包含空格的字符串。2.遍历字符串,找到每个单词的初始下标和终止下标,翻转每个单词。1.先翻转整个字符串。原创 2024-08-25 01:39:01 · 277 阅读 · 0 评论 -
JZ39 数组中出现次数超过一半的数字
用一个计数器count来统计这个超过一半的数res,如果当前元素是res,++count,如果不是,--count, 在count==0的时候,更新res.例如输入一个长度为9的数组[1,2,3,2,2,2,5,4,2]。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。给一个长度为 n 的数组,数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。原创 2024-08-22 01:51:52 · 215 阅读 · 0 评论 -
JZ78 把二叉树打印成多行
给定一个节点数为 n 二叉树,要求从上到下按层打印二叉树的 val 值,同一层结点从左至右输出,每一层输出一行,将输出的结果存放到一个二维数组中返回。2.队不空的时候进入循环,如果当前结点有左孩子,左孩子入队,plast保存,右孩子不空,右孩子入队-plast保存。1.根节点入队,pcur当前结点,plast每次保存入队结点,prelast保存每一层的最后一个结点。3.如果当前结点pcur==prelast,保存结果该行结果。原创 2024-08-22 00:41:03 · 209 阅读 · 0 评论 -
JZ68 二叉搜索树的最近公共祖先
1.对于该题的最近的公共祖先定义:对于有根树T的两个节点p、q,最近公共祖先LCA(T,p,q)表示一个节点x,满足x是p和q的祖先且x的深度尽可能大。如果root > p && root > q: 去右子树找到 第一个p < root原创 2024-08-22 00:19:12 · 384 阅读 · 0 评论 -
Jz79 判断是不是平衡二叉树
(Balanced Binary Tree),具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且。输入一棵节点数为 n 二叉树,判断该二叉树是否是平衡二叉树。在这里,我们只需要考虑其平衡性,不需要考虑其是不是排序二叉树。原创 2024-08-21 23:29:52 · 271 阅读 · 0 评论 -
Jz54 二叉搜索树的第K个结点
根据二叉搜索树的性质,我们可以尝试递归中序遍历,也就是从最小的一个节点开始,找到k个就是我们要找的目标。给定一棵结点数为n 二叉搜索树,请找出其中的第 k 小的TreeNode结点值。2.不能查找的情况,如二叉树为空,则返回-1,或者k大于n等等,也返回-1。二叉搜索树值的特点:left < mid < right。1.返回第k小的节点值即可。3.保证n个节点的值不一样。原创 2024-08-21 23:28:15 · 268 阅读 · 0 评论 -
JZ76 删除链表中重复的结点
例如,链表 1->2->3->3->4->4->5 处理后为 1->2->5。2.然后遍历set容器,再把链表出现在set中的容器删掉。原创 2024-08-20 04:03:25 · 238 阅读 · 0 评论 -
JZ55 二叉树的深度
对应leetcode 104题,层序遍历对应leetcode-102自顶向下,leetcode-107自底向上。递归代码太简单-一行就可以,可以用二叉树的层序遍历,顺便温习下二叉树层序遍历的写法。原创 2024-08-20 03:18:28 · 193 阅读 · 0 评论 -
JZ52 两个链表的第一个公共结点
i到达list1终点后继续去遍历list2, j到达list2的终点后继续去遍历list1, 第二次遍历两个游标肯定在第一个公共结点相遇。剑指offer P253解题思路1:两个链表全部入栈,然后对比栈顶结点,如果相同,同时弹出,直到找到最后一个相同结点。思路3:用双指针,遍历这两个链表,用一个游标i去遍历list1, j 去遍历list2,解题3:游标走完一个链表然后去走第二个链表,只走一次,需要设置标志位。先让长的链表走K步,然后再同步走,第一个相同的结点就是公共结点。2.长的链表先走k步。原创 2024-08-19 12:15:34 · 331 阅读 · 0 评论 -
JZ51 数组中的逆序对
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。先把数组分割成小小数组,统计出数组内部的逆序对的数目,然后再统计出两个相邻数组之间的逆序对数目。在统计逆序对的过程中,还要对数组进行排序。要求:空间复杂度 O(n)O(n),时间复杂度 O(nlogn)O(nlogn)数组中所有数字的值满足 0≤val≤1090≤val≤109。时间复杂度:用到归并排序O(nlogn),空间复杂度O(N)题目保证输入的数组中没有的相同的数字。原创 2024-08-19 11:36:55 · 360 阅读 · 0 评论 -
JZ22 链表中倒数最后k个结点
【代码】JZ22 链表中倒数最后k个结点。原创 2024-08-18 04:45:22 · 243 阅读 · 1 评论 -
JZ21 调整数组顺序使奇数位于偶数前面(一)
输入一个长度为 n 整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前面部分,所有的偶数位于数组的后面部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。原创 2024-08-18 04:27:41 · 255 阅读 · 0 评论 -
JZ20 表示数值的字符串
例如,字符串["+100","5e2","-123","3.1416","-1E-16"]都表示数值。但是["12e","1a3.14","1.2.3","+-5","12e+4.3"]都不是数值。-如果没有E或者e不会走这个语句------?---匹配0或者1个括号里面的。6.^--以xxx开头,$-以XXX结尾----可有可无,没有也可以编译通过。-d+:1一个或者多个数字---有E后面肯定有数字。---0个或者1个+或--[Ee]---只匹配一个。0个或者1个+或者-原创 2024-08-18 03:46:28 · 205 阅读 · 0 评论 -
JZ18_删除链表的结点
3.该题只会输出返回的链表和结果做对比,所以若使用 C 或 C++ 语言,你不需要 free 或 delete 被删除的节点。给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。2.题目保证链表中节点的值互不相同。1.此题对比原题有改动。原创 2024-08-18 02:03:16 · 184 阅读 · 0 评论 -
JZ14_剪绳子
因此,当 j 固定时,有 dp[i]=max(j×(i−j),j×dp[i−j])。dp[i]: 将整数i拆分成至少两个整数的和之后,这些整数最大的乘积,每个正整数对应的最大乘积取决于比它小的正整数对应的最大乘积。将 i 拆分成 j 和 i−j 的和,且 i−j 继续拆分成多个正整数,此时的乘积是 j×dp[i−j]将 i 拆分成 j 和 i−j 的和,且 i−j 不再拆分成多个正整数,此时的乘积是 j×(i−j);JZ14和leetcode343整数拆分得到的乘积最大基本是一道题。原创 2024-08-18 01:45:18 · 330 阅读 · 0 评论 -
JZ16 数值的整数次方
只需要判断exponent是否为负整数就行。原创 2024-08-18 01:20:08 · 143 阅读 · 0 评论 -
JZ15_二进制中1的个数
如果i的最低为为0, 那么dp[i] = dp[ i >> 1];//i的最低为为0,二进制数量和 i 右移1位是一样的。如何判断某个数的最低位是1还是0?-------> n & 1 == 1---最低位为1, n&1 == 0最低位为0。如果i的最低位为1, 那么dp[i] = dp[i-1] + 1;dp[i]: 数字 i二进制中含有1的个数。n&(n-1):消除最低位的1.对应leetcode_338。原创 2024-08-18 01:06:05 · 204 阅读 · 0 评论 -
JZ11_旋转数组的最小数字--有重复值
2.对于有重复的数字-有一种特殊情况,如果nums[left] = nums[mid]= nums[right],无法知道最小值在哪个区间,需要切到顺序查找。1.旋转数组的最小数字-无重复值代码实现-leetcode-153。原创 2024-08-18 01:00:05 · 189 阅读 · 0 评论 -
JZ9_两个栈实现一个队列
2.2 如果stack1不为空,但是stack2为空:把stack1依次出栈的元素push到stack2,然后再让stack2出栈。2.3.如果stack2是不为空的,直接从stack2出栈。1.用一个栈进行正常的入队,无脑pushback即可。2.1 如果两个栈都为空,返回-1;2.出栈的时候,有三种情况。原创 2024-08-18 00:53:32 · 215 阅读 · 0 评论 -
JZ8_二叉树中序遍历的下一个结点
思路:给定一个结点pNode,它的中序遍历的下一个结点有可能是它的父亲,因此,需要自底向上地将比它辈分高的结点全部先入栈。当出栈结点等于pNode的时候,说明下一个出栈结点就是所要求的结果。给出某二叉树的中序遍历的某个结点,求其下一个结点,其中二叉树除了有left、right指针指向左右孩子,还有一个next指针指向其父亲。-b1.遍历当前结点,把其左孩子全部入栈。-b3.pCur指向栈顶结点的右孩子。b.在pCur不为空或者栈不为空的时候进入循环。2.求二叉树中序遍历的下一个结点。原创 2024-08-18 00:48:59 · 212 阅读 · 0 评论 -
JZ7_用前序遍历和中序遍历重建二叉树
【代码】JZ7_用前序遍历和中序遍历重建二叉树。原创 2024-08-18 00:32:48 · 121 阅读 · 0 评论 -
JZ6_从头到尾打印链表
【代码】JZ6_从头到尾打印链表。原创 2024-08-18 00:24:27 · 388 阅读 · 0 评论 -
JZ5_替换空格
数据范围:0≤len(s)≤1000 0≤len(s)≤1000。保证字符串中的字符为大写英文字母、小写英文字母和空格中的一种。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。请实现一个函数,将一个字符串s中的每个空格替换成“%20”。原创 2024-08-18 00:23:21 · 275 阅读 · 0 评论 -
Jz3_数组中重复的数字
空间复杂度的计算主要关注于算法运行时的额外空间使用,而不包括函数运行时所需的栈空间(如参数、局部变量、寄存器信息等),因为这部分空间在编译期间已经确定,不属于运行时的额外空间。P41解释:所有操作步骤都是在输入数组上进行的,不需要分配额外的内存,因此空间复杂度为O(1).关于空间复杂度:数组用容器vector来存储,空间复杂度为O(n),2. 书中的解法思路:数组元素和下标一 一对应,时间复杂度O(N)1.---排序+双指针-时间复杂度O(nlogn),书中解法-剑指offer-P40。原创 2024-08-18 00:19:52 · 188 阅读 · 0 评论