![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指offer
文章平均质量分 72
不见风月
这个作者很懒,什么都没留下…
展开
-
[230525 剑指60] n个骰子的点数
具体的方法是,当求 n 个骰子的结果概率时,固定 n - 1 个骰子结果为 x,利用 n - 1 个骰子结果为 x 的概率乘以 1 / 6,分别计算 x + 1、x + 2、…从 n 个骰子的角度来说,n 个骰子的某一个结果的概率不是一次性算出的,而是通过累加得到的。对每一个点数组合进行相加,得到结果和,然后对相同的结果和进行统计,除以 6 ^ n,就可以得到每一种结果的概率。的特点,利用这一点在传参的时候就可以深拷贝出来一个 obj,这样进行交换的时候就不会把原来的 obj 更改。难点在递推公式,如上。原创 2023-05-25 22:30:00 · 40 阅读 · 0 评论 -
[230524 剑指59] 队列的最大值
C++ 中的队列 queue 和 deque 本身提供的 push 和 back 都是 O(1) 时间复杂度的。deque 是双端的,可以从队尾加入和弹出元素、从队首加入和弹出元素,对应接口分别是 push_back 和 pop_back、push_front 和 pop_front。queue 是单向的,从队尾加入元素、从队首弹出元素,使用的接口分别是 push 和 pop。我们可以使用一个辅助的数据结构:单调队列,队列的队头元素,就是当前队列中的最大值。时间复杂度都是O(1)。原创 2023-05-25 02:00:00 · 39 阅读 · 0 评论 -
[230523 剑指51] 数组中的逆序对
整体思路是使用归并排序的算法。在归并排序的合并过程中,若右边子数组指针指向的元素小于左边子数组指针指向的元素,则意味着出现了逆序对,逆序对数量为左子数组中未合并的元素数量。在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。别的就不说了,就是觉得这个归并排序里面的 tmp 数组引用传参写得非常妙啊!重复使用,节约空间,good.易错点在合并过程中 if 分支需要先判断下标合法性以防止越界。重难点在递归实现归并排序。原创 2023-05-24 05:00:00 · 30 阅读 · 0 评论 -
[230522 剑指49] 丑数
但是因为前面的数乘以 5 的值可能会大于后面的数乘以 2 或 3 的值,所以我们不能单纯地按顺序记录丑数序列中每一个数乘2、乘3、乘5的结果。**(确定解法)从后往前看:**因为丑数只包含质因子2、3、5,所以每一个丑数都是由在它之前的丑数序列中的某一个数乘 2、乘 3 或乘 5 得到的,于是我们可以想到动态规划的解法。在构造丑数序列时,选取下标为 a 的丑数乘 2 的结果、下标为 b 的丑数乘 3 的结果、下标为 c 的丑数乘 5 的结果中的最小值,先加入到丑数序列中,然后对应的下标递增。原创 2023-05-22 23:00:00 · 39 阅读 · 0 评论 -
[230521 剑指44] 数字序列中某一位的数字
数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等。**易错点在:**int 类型的 count 会发生上溢,应把 count 定义为 long long 类型。**重难点在:**在第 2、3 步中,理解到在第 1 步的迭代结束后,n 为新的 n(可以理解为新的下标)请写一个函数,求任意第n位对应的数字。没有,能把这题找规律写出来就不错了。则第 2 步的计算公式为。第 3 步的计算公式为。原创 2023-05-21 17:00:00 · 52 阅读 · 1 评论 -
[230520 剑指43] 1~n整数中1出现的次数
在当 n 为 INT32_MAX 时,digit 会溢出,故需要把 digit 定义为 long 变量。例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。在理解到固定当前位数字为 1 时,找到的最大的数是当前位为 1 且不超过 n 的最大的数。我们需要维护几个变量:high、low、cur、digit。,求1~n这n个整数的十进制表示中1出现的次数。并且要知道最小的数、最大的数和计算个数的关系,例如。当分析完当前位以后,迭代几个变量。遍历肯定是超时的,所以我们采用。原创 2023-05-21 06:00:00 · 57 阅读 · 0 评论 -
[230516 剑指38] 字符串的排列
求一个字符串的全排列,本质上就是穷举。我们可以把这个问题看作“有 n 个空位,我们使用给定的 n 个字符从左往右填满这 n 个空位,并且每个字符不能重复使用”。在回溯函数内部,遍历 n 个字符,尝试将某一字符放入该空位,然后进行下一次递归调用,对下一个空位进行相同的操作。下一个排列:已知当前的一个排列,快速得到字典序中下一个更大的排列。你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。在写代码的过程中描述每一个变量、每一个参数的意思。输入一个字符串,打印出该字符串中字符的所有排列。原创 2023-05-16 16:00:00 · 50 阅读 · 1 评论 -
[230515 剑指37] 序列化二叉树
这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。istringstream 可以将一个字符串与一个流相关联,从而以流的方式对字符串进行提取,这个特性使 istringstream 在分析输入时非常有用。这道题的难点在建树时需要对字符串进行切割,我们可以利用 C++ 中的 isstringstream 的优势很好地解决这一点。这题分为两个部分:把给定的二叉树序列化,和根据给定的序列还原二叉树。原创 2023-05-16 14:00:00 · 44 阅读 · 0 评论