Day5 本周心得和总结
数组
关于数组,本身结构上比较简单,所以题型上要思考的较多,思想上大多为算法单调性和不变性思想策略,模拟等
- 算法单调性和不变性思想策略,即将一个未知区间的数组亦步亦趋的转化为某些区间已知,某些区间未知的中间状态,最终转化为全部区间已知。(如二分查找的两种不同返回值情况)。
- 双指针法 序数组的平方使用了双指针法,但是思想上也是算法单调性和不变性思想,即减少了未知数组的长度,增加了需求数组的长度,最终达到完整的输出数组。
- 滑动窗口法 长度最小的子数组使用了滑动窗口法,确定每个合法的后指针为结尾的子数组长度,然后缩减前指针,找到以当前节点为结尾的最小的子数组,逻辑上来说肯定也是用算法单调性和不变性思想策略,即确定的以当前指针结尾的最小子数组的长度越来越多,最终达到全部已知,找到最小的即可。
- 螺旋矩阵II采用了模拟的思路,即亦步亦趋地根据题意,模拟整个遍历过程,逻辑上来说肯定也是用算法单调性和不变性思想策略,但是这种比较直观,所以就归为了模拟法。需要注意边界条件。
链表
关于链表,同样有两种题型,模拟和双指针
- 一种是简单模拟类型的题,这种题就是按照题目描述去操作即可,思考上主要在于单次循环需要修改的指针域和顺序,注意由于之前的修改需要提前保存的变量以及循环条件即可。
- 另一种是双指针类的题。实际上第二种也算是模拟类型,只是不像第一种题那么直观,不能根据题目描述直接得到需要遍历和单次遍历需要操作的节点,一般是通过快慢指针得到需要修改的节点后,再去做修改。比如链表相交和环形链表。
另外,关于链表,还需要注意虚拟头节点技术,一般增删改需要用来这个dummyHead来统一头节点和其他普通节点的操作,对于查找,则一般不需要使用。
总结
总的来说,在这一周的学习中,主要用了算法的不变性和单调性问题思想去解决问题,因为模拟实际也是使用了算法的不变性和单调性,但是因为题目比较直观,所以单独分出来,对于这类题,主要注意的是边界条件。而一般解决问题的思路就是增加已知,减少未知,直到达到需要。
勘误
之前认为解决问题的思路都是用了减治,实际是不对的,根据减治和分治的思想如下:
- 所谓减而治之,是为求解一个大规模的问题,可以将其划分为两个子问题:其一平凡,另一个规模缩减,分别求解子问题,由子问题的解,得到原问题的解。
- 所谓分而治之,是为求解一个大规模问题,可以将其划分为若干(通常两个)子问题,规模大体相当,分别求解子问题,由子问题的解,得到原问题的解
根据两种思想的定义,得知都是将原问题分解为子问题,所以一般使用递归处理,而我们上面的题目是实际使用了解决问题的基本思路,即就是利用算法的不变性和单调性,增加已知,减少未知。这种思想是大多数解决问题的核心思路,不管是迭代还是递归实际都是用到了这种方法。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步