代码随想录训练营二刷 总结 | 完结撒花

2023-10-24 10:36

本文主要是介绍代码随想录训练营二刷 总结 | 完结撒花,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

代码随想录训练营二刷 总结 | 完结撒花

总结:

从最开始找不到如何做算法题的门路,面对算法题一筹莫展,到现在二刷完结看题基本都知道怎么回事有思路了,感谢卡哥带我入门,学一样东西往往入门是颇具难度的,入门之后才是个人努力闪光的时候。
之后我打算刷一下卡哥新更新的图论,然后做一做hot100在不知道题目类型的情况下练习。

一、二分法

1、维持好循环不变量。

2、搜索结果如果是单点,结果由mid=target得出;搜索结果如果是区间范围或者是单区间(如求平方根只要整数向下取整即为单区间)这种要一个区间边界一个搜索,分开搜索,写到一块容易出错误。

二、双指针法

双指法的使用比较灵活,有单向的快慢双指针,也有双向指针法,也有两个指针指向相邻元素,此外还有灵活的使用全局变量记录要移动的位置。

三、滑动窗口

滑动窗口即为,不断移动窗口的起始位置和结束位置,直到得到我们想要的结果。

最典型的就是两层for循环,外层控制起始位置,内层控制结束位置。只不过滑动窗口是一层for循环控制结束位置,满足目标条件后,再移动起始位置,直至不再满足条件,然后再移动借宿位置。

四、链表操作

注意使用虚拟头结点。对于判断有环无环,可以用快慢指针,一个走两步一个走一步,能相交即为有环,然后一个从头结点出发一个从相交点出发,再次相交时即为环的入口。

五、哈希表

什么时候想到用哈希法,当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。当我们想使用哈希法来解决问题的时候,我们一般会选择如下三种数据结构。数组、set (集合)、map(映射)

两数之和、三数之和、四数之和,主要set、map、双指针的使用,三数之和、四数之和的去重、剪枝。

六、字符串

注意翻转、双指针、KMP。

七、栈和队列

栈: 栈在系统中的应用、括号匹配问题、字符串去重问题、逆波兰表达式问题

队列:滑动窗口最大值问题、求前 K 个高频元素

卡哥总结、注意大顶堆和小顶堆,优先级队列java中是PriorityQueue。

八、二叉树

求普通二叉树的最近公共祖先用后序遍历,求二叉搜索树的最近公共祖先直接从上向下搜索,搜索两个节点构成的区间,第一个在区间内的节点即为最近公共祖先。

递归何时需要返回值:

再来看返回值,递归函数什么时候需要返回值?什么时候不需要返回值?这里总结如下三点:

  • 如果需要搜索整棵二叉树且不用处理递归返回值,递归函数就不要返回值。(这种情况就是本文下半部分介绍的113.路径总和ii)

  • 如果需要搜索整棵二叉树且需要处理递归返回值,递归函数就需要返回值。 (这种情况我们在236. 二叉树的最近公共祖先 (opens new window)中介绍)

  • 如果要搜索其中一条符合条件的路径,那么递归一定需要返回值,因为遇到符合条件的路径了就要及时返回。(本题的情况)

九、回溯

组合、分割、子集、排列、棋盘、其他

组合问题:

元素可以重复使用index无需加1,元素不可以重复使用需要从下一个位置开始index+1。

如果组合数是固定个数的可以剪枝,for循环的次数小于n了就停止。

对于数组中有重复数字,但是要求结果集不能重复,需要树层去重。

分割问题:注意操作字符串的边界问题。

子集问题:

如果收集所有节点,即叶子结点和非叶子节点。

求递增子序列,如3,7,6,7 。由于不能排序树层去重,就无法使用used数组或者i > index && nums[i]== nums[i-1],因为相同的数并不挨着。又得解决树层中相同的数不能重复使用,就可以在树层间使用set数组,每递归进入下一层就是一个新数组。

求全排列,由于排列讲究顺序,如1,2,3排列结果会有2,1,3。这样就不能指定for循环的开始位置为当前数的下一个,而是固定从0开始,但是需要使用一个数组记录下来哪些使用过滤哪些没有使用,要纵向记录,因为纵向不能重复使用数字,递归标记,回溯后就没有标记,只影响纵向收集。

对于有重复数字的全排列,纵向横向都要去重,for从0开始,避免纵向重复使用used数组记录,为true为使用过,为false为没使用过,即used[i]=true跳过,横向去重需要数组排序,当nums[i]=nums[i-1]时,used[i-1]=false是回溯完的,需要树层去重。

十、贪心

注意区间问题。

十一、动态规划

分为:背包问题、打家劫舍、股票问题、子序列问题

背包问题:一维数组,dp[j] = Math.max(dp[j], dp[j-nums[i]] + nums[i])。

01背包遍历顺序:先物品后背包,物品正序,背包逆序。

如若背包正序则会出现同一个物品重复放入,如物品1重量为1,背包空间为1时放入了,背包空间为2时又放入了。
如果先背包后物品,为了避免重复放入背包依然是逆序,背包容量固定时,每种背包容量只能放入一个物品,即为最大的物品,小的物品都放不进来或者被覆盖了。

求组合数排列数:dp[j] += dp[j - nums[i]]

完全背包遍历顺序:物品背包没有先后顺序,物品背包都是正序。因为同一个物品不限量可以放入多次,在背包采用正序中。

完全背包求组合数,物品在外,背包在内。求排列数,背包在外,物品在内。

股票问题:每天是有两种状态的,持有或者不持有。

定义时都要这么定义,也可以简化为dp[0],dp[1]。

定义dp[i][0]表示第i天持有股票手中金额的最大值,dp[i][1]表示第i天不持有股票手中金额的最大值。
注意,这里的持有可以是之前持有的,也可以是当天才持有的,不持有可以是之前就没持有过,也可以说当前才卖出变成了没持有。

下面是一个每天都可以买卖的例子。

dp[0] = Math.max(dp[0], dp[1] - prices[i]);

dp[1] = Math.max(dp[1], dp[0] + prices[i]);

最后就是子序列问题,最长递增子序列、最长连续递增子序列,最长连续子数组,最长重复子序列

十二、单调栈:

一般是求左边或者右边第一个最大的元素时使用。

有两个经典的问题:接雨水和矩阵面积。解题思路(2,1,3)和(1,2,3)

这篇关于代码随想录训练营二刷 总结 | 完结撒花的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/274556

相关文章

SpringBoot中四种AOP实战应用场景及代码实现

《SpringBoot中四种AOP实战应用场景及代码实现》面向切面编程(AOP)是Spring框架的核心功能之一,它通过预编译和运行期动态代理实现程序功能的统一维护,在SpringBoot应用中,AO... 目录引言场景一:日志记录与性能监控业务需求实现方案使用示例扩展:MDC实现请求跟踪场景二:权限控制与

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

利用Python调试串口的示例代码

《利用Python调试串口的示例代码》在嵌入式开发、物联网设备调试过程中,串口通信是最基础的调试手段本文将带你用Python+ttkbootstrap打造一款高颜值、多功能的串口调试助手,需要的可以了... 目录概述:为什么需要专业的串口调试工具项目架构设计1.1 技术栈选型1.2 关键类说明1.3 线程模

Python Transformers库(NLP处理库)案例代码讲解

《PythonTransformers库(NLP处理库)案例代码讲解》本文介绍transformers库的全面讲解,包含基础知识、高级用法、案例代码及学习路径,内容经过组织,适合不同阶段的学习者,对... 目录一、基础知识1. Transformers 库简介2. 安装与环境配置3. 快速上手示例二、核心模

Java的栈与队列实现代码解析

《Java的栈与队列实现代码解析》栈是常见的线性数据结构,栈的特点是以先进后出的形式,后进先出,先进后出,分为栈底和栈顶,栈应用于内存的分配,表达式求值,存储临时的数据和方法的调用等,本文给大家介绍J... 目录栈的概念(Stack)栈的实现代码队列(Queue)模拟实现队列(双链表实现)循环队列(循环数组

Python实现图片分割的多种方法总结

《Python实现图片分割的多种方法总结》图片分割是图像处理中的一个重要任务,它的目标是将图像划分为多个区域或者对象,本文为大家整理了一些常用的分割方法,大家可以根据需求自行选择... 目录1. 基于传统图像处理的分割方法(1) 使用固定阈值分割图片(2) 自适应阈值分割(3) 使用图像边缘检测分割(4)

Windows Docker端口占用错误及解决方案总结

《WindowsDocker端口占用错误及解决方案总结》在Windows环境下使用Docker容器时,端口占用错误是开发和运维中常见且棘手的问题,本文将深入剖析该问题的成因,介绍如何通过查看端口分配... 目录引言Windows docker 端口占用错误及解决方案汇总端口冲突形成原因解析诊断当前端口情况解

使用Java将DOCX文档解析为Markdown文档的代码实现

《使用Java将DOCX文档解析为Markdown文档的代码实现》在现代文档处理中,Markdown(MD)因其简洁的语法和良好的可读性,逐渐成为开发者、技术写作者和内容创作者的首选格式,然而,许多文... 目录引言1. 工具和库介绍2. 安装依赖库3. 使用Apache POI解析DOCX文档4. 将解析

C++使用printf语句实现进制转换的示例代码

《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指

使用Python实现全能手机虚拟键盘的示例代码

《使用Python实现全能手机虚拟键盘的示例代码》在数字化办公时代,你是否遇到过这样的场景:会议室投影电脑突然键盘失灵、躺在沙发上想远程控制书房电脑、或者需要给长辈远程协助操作?今天我要分享的Pyth... 目录一、项目概述:不止于键盘的远程控制方案1.1 创新价值1.2 技术栈全景二、需求实现步骤一、需求