剑指offer
文章平均质量分 88
记与思
没有记录便没有存在。
展开
-
剑指offer(七)
继续优化,感觉vector这个数据结构能换一换,每次在vector中间插入元素,从插入位置开始后面所有元素都要移动,这个是O(N)的。所以直接用迭代法遍历一次,每遍历一个数k减1,k减为0时就找到了第k小的元素。这样优化以后力扣能多过一点数据了,但还是不能全过去,21个用例,过了20个。法一的写法很直观,但对于2和3需要有个特判,不太统一显得不是特别优雅。拆分后的最大乘积了,与最初dp[i]的定义略有不符,所以有点不太美观。力扣上的题目不一样,但就是换了个皮,内核一样,还是直接暴力。,有STL为啥不用呢。原创 2024-01-07 17:14:27 · 811 阅读 · 1 评论 -
剑指offer(六)
构建乘积数组_牛客题霸_牛客网 (nowcoder.com)第一印象是求数组全部元素的乘积,然后每个位置都除以自己即可。但题目要求无法使用除法,只能另寻他法。啥也不管了,先暴力吧。法二两次遍历。乍看好像毫无头绪,但是细细琢磨发现等于a中除外所有元素的乘积,即。而在一次遍历过程中左边或右边单独的乘积是可以累计的。故,52. 正则表达式匹配正则表达式匹配_牛客题霸_牛客网 (nowcoder.com)看起来就是实现正则表达式里的和。想不到怎么搞。C++11支持正则表达式了,但是牛客这里必须自己引入头文件原创 2024-01-07 17:12:37 · 849 阅读 · 1 评论 -
剑指offer(五)
其实,如果是python或者JAVA可以直接用split分割之后整体反转一下再加起来就行了。初看好简单,仔细一看不能使用乘除和判断,也就是说只能用加法和条件判断,故不能用求和公式,那就基本只能用位运算进行条件判断了。题目怎么说,我就怎么写。说是反转,我就直接倒着数。然后单词之间是用空格分割的可以想到利用流的特性完成句子的分割。题目怎么说就怎么写,一位一位的数,遇见不对的直接返回0。找第一个重复的数字,那就从头开始数,一边数一边用。由于是升序数据,可以利用滑动窗口。题目怎么说,那就怎么写。原创 2024-01-07 17:11:54 · 894 阅读 · 1 评论 -
剑指offer(四)
所有的字母中ASCII码最小的是A(65),最大的是z(122),故需要一个大小为122-65+1=58的数组来记录这些字符出现的次数。该数的1表示A与B不同的位,0表示相同的位。故nums的逆序对=(1)左半数组的逆序对 + (2)右半数组逆序对 + (3)左右两边的逆序对(右边数组中的数<左边数组时)。由于是非降序数组,可以利用二分法寻找k的后一个元素和k的前一个元素的索引位置,两者相减就是k出现的次数。如果记不清ASCII码最小的字符是A还是a,直接用哈希表来存也是一样的,只需要一个简单的替换。原创 2024-01-07 17:11:04 · 848 阅读 · 1 评论 -
剑指offer(三)
本题的复杂之处在于多了一个random指针的复制。next指针的复制十分轻松,但复制之后如何完成random指针的复制是个问题。可以考虑在复制next指针时,用哈希表存储原节点与复制节点的映射。这样只要两次遍历,第一次复制next指针,第二次根据映射关系将原来random的指向映射到新链表上即可完成random指针的复制。先中序遍历二叉树,将其放入一个vector中,然后遍历vector改变指针朝向即可。摩尔投票法:寻找一组元素中占多数的元素的算法。用一个全局的pre指针记录当前遍历节点的前继节点。原创 2024-01-07 17:10:21 · 938 阅读 · 1 评论 -
剑指offer(二)
故需要先序遍历A的每个节点判断以A中的节点node为根节点的子树是否包含树B。例如,计算一个数的10次方相当于计算一个数的1010(二进制)次方,可以看作按照x的2次方一次递增。****对指定区域内的数据进行分组,重新排列指定区域内存储的数据,使其分为两组,第一组位符合筛选条件的数据,另一组为不符合筛选条件的数据。起一个虚拟头节点,然后一边遍历,一边将小的插在都节点后面,直到两个链表有一个为空。这里用先序遍历,先交换节点的左右子节点,之后分别递归处理左右子树。以1,2,3链表为例,用三个指针,原创 2024-01-07 17:09:24 · 872 阅读 · 1 评论 -
剑指Offer(一)
每次都用distance去中序序列中找根节点太麻烦了,直接一开始用哈希表记录每个节点和它的索引。若参数是string的话还得resize一下,str的话可以直接写,但这样其实本身并不优雅。常规做法,直接遍历找第一个减小的数字。记得当时在Leetcode上做的时候参数是string,牛客是str,不过都一样。很简单,一个栈进,一个栈出。不考虑每一列的顺序,只利用每一行的有序性,在每一行中都使用二分法。根据二叉树先序遍历和中序遍历的规则,找到根节点,递归建立二叉树。从右上往左下找,由于每一行每一列都是递增的,原创 2024-01-07 17:08:03 · 1134 阅读 · 1 评论