力扣刷题_第六周

第六周

注:1、由于主要记录的是刷题的总结和心得,与后端学习有联系但相关度不高,因此该连载系列更名;2、从本周开始不再详细记录具体日期和第几天,不再拘泥于具体的某天做了某些题;3、不再针对每一道题粘贴具体的题解代码,将更多精力放在分析题目和总结部分。具体题解代码可在力口个人主页的题目分析中寻找。

东哥带你刷二叉树(后序篇)

何时要用后序?

由前文学习可知,前序位置的代码只能从函数参数中获取父节点传递来的数据,而后序位置的代码不仅可以获取参数数据,还可以获取到子树通过函数返回值传递回来的数据。

那么换句话说,一旦发现题目和子树有关,那大概率要给函数设置合理的定义和返回值,在后序位置写代码了

652. 寻找重复的子树

652. 寻找重复的子树 - 力扣(LeetCode)

题目描述:给定root,返回所有重复子树。同类子树只用返回其中任意一颗的根节点即可。

分析:1、返回根节点,如叶子结点只返回其本身,如1<- 4 ->2是以4为根节点具有左右节点的子树,需返回根节点4,但是在打印时是[4,1,2]的结构

2、对于每一个节点,需要知道:以我为根的这颗二叉树(子树)是什么样? 以其他节点为根的子树长什么样? 这就需要按后序序列化,并保存每个子树输出的结果以方便比较

3、采用拼接字符串的方式后序序列化,采用unordered_map记录子树(不应有重复)

归并排序详解及应用

912.排序数组

912. 排序数组 - 力扣(LeetCode)

分析:归并排序的核心在于merge()函数,本质是二叉树的后序遍历

315.计算数组右侧小于当前元素的个数(华为5.11机试题T1)

315. 计算右侧小于当前元素的个数 - 力扣(LeetCode)

分析:这题和归并排序什么关系呢,主要在 merge 函数,我们在使用 merge 函数合并两个有序数组的时候,其实是可以知道一个元素 nums[i] 后边有多少个元素比 nums[i] 小的

换句话说,在对 nuns[lo..hi] 合并的过程中,每当执行 nums[p] = temp[i] 时,就可以确定 temp[i] 这个元素后面比它小的元素个数为 j - mid - 1

当然,nums[lo..hi] 本身也只是一个子数组,这个子数组之后还会被执行 merge,其中元素的位置还是会改变。但这是其他递归节点需要考虑的问题,我们只要在 merge 函数中做一些手脚,叠加每次 merge 时记录的结果即可。

快速排序详解及应用

912.排序数组

912. 排序数组 - 力扣(LeetCode)

分析:快速排序的核心在于partition()函数,本质是二叉树的先序遍历,是构造二叉搜索树的过程

注意:1、必须用shuffle洗牌算法打乱数组,否则在精心设计的测试用例上面会导致O(n^2)的时间复杂度,引入随机性可以避免最坏情况的发生

2、快速排序是不稳定的排序,每次只能确定一个元素的最终位置。而归并排序是稳定的排序方式。

在实际工程中我们经常会将一个复杂对象的某一个字段作为排序的 key,所以应该关注编程语言提供的 API 底层使用的到底是什么排序算法,是稳定的还是不稳定的,这很可能影响到代码执行的效率甚至正确性

215.数组中的第K个最大元素

215. 数组中的第K个最大元素 - 力扣(LeetCode)

解法:二叉堆(优先队列)或者快速选择算法

快速选择算法分析:快排算法的变体。找数组的第K大元素其实就是找第k’ = N - K个元素。快排每次partition会确定在nums[p]这个位置上的元素,这时候,虽然还没有把整个数组排好序,但我们已经让 nums[p] 左边的元素都比 nums[p] 小了,也就知道 nums[p] 的排名了。

那么我们可以把 pk' 进行比较,如果 p < k' 说明第 k' 大的元素在 nums[p+1..high] 中,如果 p > k' 说明第 k' 大的元素在 nums[low..p-1]

进一步,去 nums[p+1..hi] 或者 nums[lo..p-1] 这两个子数组中执行 partition 函数,就可以进一步缩小排在第 k' 的元素的范围,最终找到目标元素。

本周小结

近期刷题状态、进度一般,仔细分析后发现主要由以下两个方面原因导致。一是刷题进入瓶颈期,征服新颖题目的新鲜感不如开始那么强烈,往往“欲速则不达”;二是由于题目难度提升,虽然解题思路能理解,但是实现较为困难,因为解题所采用的具体的STL模板和库函数还是不熟练,有好几次需要查新的东西,还有东哥的算法是Java实现的,而我需要改成C++。解决措施是,一是心态上还是不能着急,慢慢来,循序渐进,之前“欠债”太多,现在是痛苦的”还债“过程,不能急于求成;二是对于难题,在现阶段要懂得适当放过,把握其解法思路更为重要。同时,读《C++ Primer》加强对STL模板和库函数的理解;改变CSDN的《C++后端学习日记》记录形式,不再粘贴具体的代码,不能为了粘贴代码而记录总结。

你可能感兴趣的:(青涩,leetcode,算法,排序算法)