自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(32)
  • 收藏
  • 关注

原创 代码随想录算法训练营 DAY 27 | 93.复原IP地址 78.子集 90.子集II

如果把 子集问题、组合问题、分割问题都抽象为一棵树的话,那么组合问题和分割问题都是收集树的叶子节点,而子集问题是找树的所有节点!子集,组合,分割问题,回溯算法的for都是从startIndex开始!无序,取过的元素不会重复取)排列问题的for是从0开始!(有序,[1,2]和[2,1]是两个)子集问题进入递归就先收集结果(收集的其实是上一层的)-如果nums有重复元素,先排序。树枝去重用used数组(),continue跳到下一个i。

2024-04-09 10:23:02 381

原创 代码随想录算法训练营 DAY 27 | 39.组合总和 40.组合总和 II 131.分割回文串

虽然都是一进for循环里就判断,但一个是continue一个是break!continue代表跳到下一个i+1开始搜,不进入下一层递归。break代表直接结束整个for循环,终止搜索!初始化used数组可以用切割回文串问题要联想到组合问题,startIndex相当于切割线,终止条件就是起始位置≥s的长度。在单层逻辑里判断是不是回文串,是就直接substring收集子串,不是就continue(直接跳到下一个i,不会进入下一层递归)。这样可以直接在终止条件里收集path了。substring是左闭右开!!

2024-04-08 22:43:31 1083

原创 代码随想录算法训练营 DAY 25 | 216.组合总和III 17.电话号码的字母组合

数字的list恢复现场用,path数组是LinkedList字符串恢复现场用电话号码题用String数组保存映射关系。取出String每一位上的可以直接单层递归逻辑里for循环的次数就是 这一位上能填的值的情况总数!

2024-03-30 16:45:14 469

原创 代码随想录算法训练营 DAY 24 | 回溯理论基础 77.组合 + 剪枝优化

举个例子:假设n=4,k=3,path里0个元素。至多从4-(3-0)+1=2,至多从2开始。剪枝剪的是孩子,在for循环里完成的,修改i开始遍历的位置,如果元素个数不够了就提前剪掉。子集问题 1 2 3 4,子集有1 2 3 4,12,13,14,…for循环,用path收集路径上的元素,然后递归下一层(起始位置i+1)+恢复现场。(列表剩余元素数目>=所需元素数目),加不加1依照实际情况决定。组合(无顺序) 1 2 3 4 给出大小为2的所有组合。抽象成一个n叉树,树的宽度就是集合的大小。

2024-03-29 22:41:56 616

原创 代码随想录算法训练营 DAY 23 | 450.删除二叉搜索树中的节点 669.修剪二叉搜索树 538.把二叉搜索树转换为累加树

深度优先[二叉树:前中后序递归法:递归三部曲初次亮相[二叉树:前中后序迭代法(一) :通过栈模拟递归[二叉树:前中后序迭代法(二)统一风格]广度优先[二叉树的层序遍历]:通过队列模拟。

2024-03-28 21:21:33 732

原创 代码随想录算法训练营 DAY 22 | 235.二叉搜索树的最近公共祖先 701.二叉搜索树中的插入操作 450.删除二叉搜索树中的节点

利用二叉搜索树的性质从上到下去遍历,遇到 cur节点是数值在[p, q]区间中则一定可以说明该节点cur就是p 和 q的公共祖先。问题来了,?如果 从节点5继续向左遍历,那么将错过成为p的祖先, 如果从节点5继续向右遍历则错过成为q的祖先。所以当我们从上向下去递归遍历,第一次遇到 cur节点是数值在[q, p]区间中,那么cur就是 q和p的最近公共祖先。

2024-03-28 09:17:47 459

原创 代码随想录算法训练营 DAY 21 | 230.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 236.二叉树的最近公共祖先

用一个全局变量result存储最小绝对差,prev指针存储在中的逻辑里去更新result(保证prev不为空),然后更新prev=cur。牢记谦虚遍历的顺序!pre紧跟在cur后面移动。

2024-03-27 13:10:09 419

原创 代码随想录算法训练营 DAY 20 | 654.最大二叉树 617.合并二叉树 700.二叉搜索树中的搜索 98.验证二叉搜索树

二叉搜索树 中序遍历结果是有序的构造二叉树 用前序遍历。

2024-03-26 10:49:53 456

原创 代码随想录算法训练营 DAY 18 | 513.找树左下角的值 513.找树左下角的值 106.从中序与后序遍历序列构造二叉树

递归函数什么时候需要返回值?如果需要搜索整棵二叉树且不用处理递归返回值,递归函数就不要返回值。如果需要搜索整棵二叉树且需要处理递归返回值,递归函数就需要返回值。如果要搜索其中一条符合条件的路径,那么递归一定需要返回值,因为遇到符合条件的路径了就要及时返回。(本题的情况)list:add(E):在末尾增加元素add(int, E):在指定位置增加元素remove(int):删除指定位置的元素remove(Object):删除指定元素set(int, E):修改指定位置的元素。

2024-03-25 09:53:50 582

原创 代码随想录算法训练营 DAY 17 | 110.平衡二叉树 257.二叉树的所有路径 404.左叶子之和

List可以用获取第i个元素List用删除第i个元素List长度是StringBuilder转换为String用。

2024-03-22 21:59:11 834

原创 代码随想录算法训练营 DAY 16 | 104.二叉树最大深度 111.二叉树最小深度 222.完全二叉树的节点个数

把左和右递归遍历的操作放到一个for循环里,遍历node.children 得到depth,最后return depth+1即可!对于情况二,分别递归左孩子,和右孩子,递归到某一深度一定会有左孩子或者右孩子为满二叉树,然后依然可以按照情况1来计算。核心思路:利用完全二叉树特性,因为题目是完全二叉树,直接全部遍历左孩子和右孩子,如果高度相等它就是满二叉树,直接。完全二叉树只有两种情况,情况一:就是满二叉树,情况二:最后一层叶子节点没有满。前序遍历和后序遍历都可以,前序求的是深度,后序求的是高度。

2024-03-21 22:38:16 1004

原创 代码随想录算法训练营 DAY 15 | 二叉树的层序遍历 226.翻转二叉树 101.对称二叉树

我们是用队列来保存元素。同时,用来表示一层有几个节点。遍历每一层(每一层遍历size次)的同时,把它的左右孩子都入队(插入队尾)(如果有的话)。

2024-03-20 23:56:02 798

原创 代码随想录算法训练营 DAY 14 | 二叉树的递归遍历和迭代遍历

int val;Collections.reverse(传一个list)确定递归函数的参数和返回值确定终止条件确定单层递归的逻辑迭代遍历,先看前序。用栈来模拟迭代遍历。一共分为两步操作:访问节点+处理节点前序:中 左 右。但是按照右-左顺序入栈后序就是交换左右顺序,然后整个res反转。迭代遍历中序:需要一个指针cur帮助我们遍历二叉树,处理的时候把元素加入到res数组里。非空就入栈,指针往左走,当前为空了就出栈 同时输出到数组 往右走!

2024-03-19 21:04:55 1111

原创 代码随想录算法训练营 DAY 13 | 239.滑动窗口最大值 347.前 K 个高频元素

比较一下队列和栈相关方法的不同:队列:add():在队尾添加元素remove():删除并返回队头isEmpty():是否为空栈:push():压入元素pop():弹出栈顶元素,并返回栈顶元素peek():返回栈顶元素empty():是否为空其他求长度size(),求堆头/栈顶peek()和清空clear()都是一样的!注意在java中,栈是一个实现类。而队列是一个接口,实现类有LinkedList和PriorityQueue关于deque队头元素:deque.peek()

2024-03-18 20:43:24 900

原创 代码随想录算法训练营 DAY 11 | 20.有效的括号 1047. 删除字符串中的所有相邻重复项 150. 逆波兰表达式求值

相邻字符消除的操作,很多用栈来解决!栈与递归之间在某种程度上是可以转换的遍历字符串数组可以用String转数字用deque,尤其是ArrayDeque实现类当做栈比Stack更快!注意遍历顺序和出栈顺序是相反的!具体实现要变一下。

2024-03-16 19:30:31 956

原创 代码随想录算法训练营 DAY 10 | 232.用栈实现队列 225.用队列实现栈

比较一下队列和栈相关方法的不同:队列:add():在队尾添加元素remove():删除并返回队头isEmpty():是否为空栈:push():压入元素pop():弹出栈顶元素,并返回栈顶元素push():压入元素pop():弹出栈顶元素,并返回栈顶元素peek():返回栈顶元素其他求长度size(),求堆头/栈顶peek()和清空clear()都是一样的!注意在java中,栈是一个实现类。而队列是一个接口,实现类有LinkedList和PriorityQueue。

2024-03-15 19:20:12 1049

原创 代码随想录算法训练营 DAY9 | 被KMP击碎的一天 总结回顾字符串和双指针

next数组就是一个前缀表(prefix table)。前缀表有什么作用呢?前缀表是用来回退的,它记录了模式串与主串(文本串)不匹配的时候,模式串应该从哪里开始重新匹配。举一个例子:要在文本串:aabaabaafa 中查找是否出现过一个模式串:aabaaf。可以看出,文本串中第六个字符b 和 模式串的第六个字符f,不匹配了。如果暴力匹配,发现不匹配,此时就要从头匹配了。但如果使用前缀表,就不会从头匹配,而是从上次已经匹配的内容开始匹配,找到了模式串中第三个字符b继续开始匹配。为啥能移动到b?

2024-03-14 22:38:51 995

原创 代码随想录算法训练营 DAY8 | 344.反转字符串 541.反转字符串II 卡码网54.替换数字 151.反转字符串中的单词 卡码网55.右旋字符串

java中String是不可变的。可以考虑新建一个然后用append拼接,或者用方法转化成char数组再进行操作。最后返回的时候。左旋/右旋字符串:先整体反转,再分别反转左半部分和右半部分即可swap方法可以用tmp或者位运算实现。注意是左闭右闭的去除一个字符串中多余空格的逻辑比较复杂,回顾移除数组那道题里的实现,用快慢指针,slow指向符合的元素要放的位置,fast指针遍历整个串 去找不为空格的字符。放完一个单词之后要手动添加一个空格(注意首个字符的情况 不用放)

2024-03-13 15:00:41 876

原创 代码随想录算法训练营 DAY7|454.四数相加II 383.赎金信 15.三数之和 18.四数之和

list操作:Arrays.asList(num1,num2,num3)可以把几个数转换成list返回!map.getOrDefault(key,默认值)如果有对应的key,返回value,如果没有返回默认值。可以用来简化统计出现次数的操作。三数之和 和 四数之和思路相近,都是遍历一个i或者i和j,拿着这个,用双指针对后面的进行判断。去重和剪枝的细节需要注意。

2024-03-12 17:58:28 1046

原创 代码随想录算法训练营 DAY6| 242.有效的字母异位词 349.两个数组的交集 202.快乐数 1.两数之和

2.选择数组,set,map的原则元素比较少,范围可控,元素较为连续 —选数组数值比较大,元素很分散 —选set有key value对应 —选map3.数组如果要动态添加元素,就要用ArrayList。4.如何取每个位置上的单数?​ }5.如果有一个重复性高的需求,考虑另外单独写成一个方法。如:getSum()方法 求每个位置上数的平方和6.HashSet对应的方法//初始化//添加元素//返回set的大小set.size();//查询是否含有某元素。

2024-03-11 21:27:30 1121

原创 代码随想录算法训练营 DAY4| 24.两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题 02.07.链表相交 142.环形链表II

最后都是要想到双指针。都从dummyhead开始比较好如果要删除或者修改方向记得用tmp保存注意遍历while的终止条件!考虑停下来的最终情况(第一次不满足时),此时就是while()括号里的条件,走到这个情况了就不会进入while了。要删除或者插入节点,要让cur指向它的前一个。求两个链表交点就是让长的那个先走长度的差值步,再从同一起跑线一起走。一次走两步,遍历条件是while(fast!=null)

2024-03-09 23:38:27 855

原创 代码随想录算法训练营 DAY3| 203.移除链表元素 707.设计链表 206.反转链表

记得要写构造函数。// 结点的值int val;// 下一个结点// 节点的构造函数(无参)// 节点的构造函数(有一个参数)// 节点的构造函数(有两个参数)遍历条件里最好不要写cur->next。当cur为null时会空指针异常遍历链表找结束条件就是看 到什么情况下,就停止操作了,找这个临界情况就是while里的判断条件递归需要考虑终止条件,下一次递归的新参数以及返回值。通常另外写一个函数用来递归,在原函数里调用它。

2024-03-09 18:40:27 1025

原创 代码随想录算法训练营 DAY2| 977.有序数组的平方 209.长度最小的子数组 59. 螺旋矩阵 II

计算数组长度要用j-i+1滑动窗口精髓在于遍历的是终止位置,动态移动起始位置。同时更新子数组长度和结果动态更新结果可以用记得考虑整个数组的和仍比target小的情况!这里两道题用到了循环不变量区间的定义。以及两个双指针,双指针的目的就是在一层for里做两层for的事情。滑动窗口也很巧妙,精髓在于遍历的是终止位置,如何动态移动起始位置。螺旋矩阵我先用的碰撞检测法,4个方向偏移量,感觉比较容易理解。

2024-03-07 21:25:42 852

原创 代码随想录算法训练营DAY1 | 704. 二分查找、27. 移除元素

学习时长:2小时题目难度:还好今天第一天主要是熟悉刷题的感受,学习了二分法左闭右闭和左闭右开两种写法。(以后自己写还是用左闭右闭,左闭右开要多考虑一点 比较麻烦)。双指针每次听完讲解都恍然大悟,以后自己写又不回了,要多积累双指针能运用的题型。

2024-03-06 19:05:39 1212 1

原创 JavaSE 数据类型与变量的认识(对比c语言)

int转String:String str1 = String.valueOf(num);String转int:int num = Integer.parseInt(str);二、字符串、整形、浮点型、字符型以及布尔型,在Java中都称为数据类型。1.隐式:数据范围小的转为数据范围大的时会自动进行。使用哪种类型就像挑选衣服尺码一样,选择最合适的。2.显式:强制转换。数据范围大的到数据范围小的。一、分类:基本数据类型和引用数据类型。与c++类似,可以直接用+号拼贴。...

2022-08-08 15:54:20 465

原创 JavaSE初步认知

和c语言的不同之处,你看出来了吗?显然,这里无需先#include,main函数的最外层还有一个public class HelloWorld的“函数”。先通过javac编译程序把源文件进行编译,编译后生成的.class文件是由字节码组成的,与平台无关、面向JVM的文件。最后启动java虚拟机来运行.class文件,此时JVM会将字节码转换成平台能够理解的形式来运行。关键字是由Java语言提前定义好的,有特殊含义的标识符,或者保留字。注意:标识符不能以数字开头,也不能是关键字,且严格区分大小写。...

2022-08-08 15:27:04 250

原创 自定义类型详解(结构体,位段,枚举,联合)

定义变量的同时,赋初始值structKb={return0;}第一种定义的是局部变量,赋值后打印第二种定义的是全局变量,也是赋值后打印。

2022-07-20 21:34:32 335 1

原创 C语言动态内存开辟详解(malloc,calloc,realloc,free,柔型数组)

Q:为什么需要动态内存分配?//在栈上开辟4个字节的空间chararr[10]={0};//在栈上开辟10个字节的连续空间另外,数组在申明的时候,必须指定数组的长度,它所需要的内存在编译时分配。但是,当所需空间的大小在程序运行时才能知道,也就无法事先开辟一块空间了,这时候就需要动态内存开辟。...

2022-07-19 12:57:07 1392

原创 C语言实现扫雷小游戏

用C语言来写一个扫雷小游戏吧!核心思想构造两个二维数组,show数组用于展示排雷的下棋界面,mine数组用于记录放置地雷。

2022-07-15 14:00:05 710

原创 C语言实现3x3三子棋(电脑概率先手下棋)

用C语言来写一个3x3棋盘、与电脑对战的三子棋游戏!

2022-07-15 10:49:54 838

原创 C语言字符串库函数详解&模拟实现(strlen、strcpy、strcat、strcmp)+字符操作函数+字符转换函数

C语言字符串库函数详解&模拟实现(strlen、strcpy、strcat、strcmp)+字符操作函数+字符转换函数

2022-07-14 12:38:20 2570 1

原创 C语言内存函数详解&模拟实现(memcpy、memmove、memcmp、memset)

memcpy、memmovee、memcmp、memset详解&模拟实现

2022-07-14 11:22:27 443

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除