
算法
文章平均质量分 71
分享日常刷算法的笔记,包含数组、双指针、回溯、动态规划、贪心、图论等专题
落雨既然
进阶式学习Java基础、JUC、JVM、框架、消息队列、微服务、计算机网络,操作系统等...
一个努力提升技术能力,热爱编程的小卡拉米。
个人博客网站:https://axdmdyj.github.io/
展开
-
爱上算法:每日算法(24-2月5号)
🌟坚持每日刷算法,😃将其变为习惯🤛让我们一起坚持吧💪。原创 2024-02-05 23:18:16 · 599 阅读 · 0 评论 -
爱上算法:每日算法(24-2月3号)
🌟坚持每日刷算法,😃将其变为习惯🤛让我们一起坚持吧💪。原创 2024-02-03 23:15:50 · 325 阅读 · 0 评论 -
爱上算法:每日算法(24-2月2号)
🌟坚持每日刷算法,将其变为习惯🤛。原创 2024-02-02 20:08:38 · 215 阅读 · 0 评论 -
螺旋矩阵||
Problem: 59. 螺旋矩阵 II文章目录思路解题方法复杂度Code思路本体采用循环不变量,对于判断每次螺旋的边界麻烦,不妨都采取左闭又开的原则解题方法第一个不太好理解的地方就是为什么循环n/2圈?是因为最后循环结束的时候StartX一定是在相对于第一条边中间的位置,那么循环了多少圈就可以由这个点对两边的竖边的条数进行分割.两边的条数一定是相等的,有就是转了多少圈.第二个地方就是左开右闭,每到一个节点就进入下一个边的循环.在每个圈数结束后,更新起点,横纵坐标都加一.startX原创 2023-08-04 00:01:40 · 57 阅读 · 1 评论 -
力扣:移除链表元素
Problem: 203. 移除链表元素文章目录思路解题方法复杂度Code(java)Code(C++)思路遍历链表,如果相等,需要删除的元素的左边节点指向删除元素的右边节点.如果删除的是表头元素,为了统一,建立一个虚拟头结点解题方法定义一个虚拟头结点dummyHead,和遍历需要的指针cur,进入循环,遍历链表元素,如果相等就将删除的元素的左边节点指向删除元素的右边节点.如果删除的是表头元素,为了统一,建立一个虚拟头结点.直到cur->next != null.因为cur =原创 2023-08-04 22:53:30 · 132 阅读 · 1 评论 -
力扣-移除元素
Problem: 27. 移除元素文章目录思路解题方法复杂度Code思路首先可以用暴力,两层for循环.但O(n^2)快慢双指针:通过两个指针,来对数组进行处理解题方法首先定义一个慢指针si,然后再循环中定义一个快指针fi,然后通过判断fi和val1是否相等,如果相等,说明这个值要被覆盖,所以慢指针停止,快指针向后,直到快指针和对应的val2不相等,就可一将这个值覆盖到val1的位置上,然后将si++,直到遍历完整个数组复杂度时间复杂度:O(n)O(n)O(n)空间原创 2023-07-29 22:27:39 · 44 阅读 · 0 评论 -
力扣:反转链表
Problem: 206. 反转链表文章目录思路解题方法复杂度CodeCode思路双指针算法,定义pre,和cur,来遍历链表.然后进行反转解题方法定义一个temp记录cur->next的位置,当反转通过cur->next=pre来完成,所以之后pre = cur, cur=tmep(向后移动),直到cur为空,即达到遍历完成的效果复杂度时间复杂度:O(n)O(n)O(n)空间复杂度:O(n)O(n)O(n)Code/** * Defin原创 2023-08-06 20:59:27 · 56 阅读 · 0 评论 -
力扣: 有序数组的平方
title: 有序数组的平方date: 2023-07-30 23:04:11tags:- 双指针categories:- 力扣原创 2023-07-30 23:19:01 · 85 阅读 · 0 评论 -
力扣:删除倒数第n个结点
---title: 删除倒数第n个结点date: 2023-08-08 23:40:39tags:- 链表- 双指针categories:- 算法---原创 2023-08-08 23:48:32 · 57 阅读 · 0 评论 -
算法60天训练–10-04-day25
回溯是递归的副产品,只要有递归就会有回溯,所以回溯法也经常和二叉树遍历,深度优先搜索混在一起,因为这两种方式都是用了递归。回溯算法能解决如下问题:组合问题题目链接: https://leetcode.cn/problems/combinations/description/通过列举10086层搜索的过程:for循环横向遍历,递归纵向遍历,回溯不断调整结果集,这个理念贯穿整个回溯法系列可以通过思考在哪一步不需要继续往下遍历了. 然后进行剪枝优化剪枝精髓是:for循环在寻找起点的时候要有一个范围,如果这个起原创 2023-10-08 00:55:48 · 65 阅读 · 0 评论 -
算法60天训练–10-04-day25
因为同一树层,used[i - 1] == false 才能表示,当前取的 candidates[i] 是从 candidates[i - 1] 回溯而来的。对于sum已经大于target的情况,其实是依然进入了下一层递归,只是下一层递归结束判断的时候,会判断sum > target的话就返回。组合问题可以抽象为树形结构,那么“使用过”在这个树形结构上是有两个维度的,一个维度是同一树枝上使用过,一个维度是同一树层上使用过。回看一下题目,元素在同一个组合内是可以重复的,怎么重复都没事,但两个组合不能相同。原创 2023-10-04 23:16:30 · 73 阅读 · 0 评论 -
算法60天训练–10-03-day24
思考这段代码的时候,暂时不要去考虑backtracking里面的过程,直接到。补充一下: 回溯算法递归的参数很难一次确定,需要用到什么参数,填什么参数。,然后进行下一层for循环,这两个相当于是清理战场了,然后换一个。跟组合一样,遍历到第k层其实就已经将树的深度遍历完了。层呢,for循环是并不可能的. 这是和。多了一个判断找出的集合之和等于n的判断。每一层都是遍历的数都是上一层的数。了,那么也没有必要继续往下遍历了。,因为集合中不能出现重复的数。本题一眼看可以暴力,因为如果。, 或者定义一个二维数组,原创 2023-10-03 19:42:43 · 93 阅读 · 0 评论 -
算法60天训练–10-02-day23
path数组的大小等于k时,找到了一个子集大小为k的组合,在path存的就是根节点到叶子结点的路径。 当n = 9, k = 9, 那么 起始从2开始到9也不到9个数,对于一个集合,相当于是递归树的宽度,而k相当于是递归的深度。n, 集合大小. k 组合集合的大小(树的深度)递归来做层叠嵌套(可以理解是开k层for循环),回溯法虽然是暴力搜索,但有时候也是可以剪枝优化的。比如1,2,3,4下一层就要从2开始。就直接可以用两层for循环可以解决。for循环, => 横向遍历集合。原创 2023-10-02 16:29:15 · 82 阅读 · 0 评论 -
算法60天训练–9-21-day16
对于求深度,和求高度.都可以用后序遍历,因为一个二叉树的最大深度和最大的高度是相等的。可以使用递归,即递归的求左右两节点的长度, 并将左右两节点的长度取最大值.但因为是一个完全二叉树,根据完全二叉树的性质,我们又可以采用另一种方法。比较容易想到的就是后序遍历,做法跟前两道是一样的.求最大深度, 首先可以想到,前序遍历和后序遍历。因为当在根结点有空的子节点的时候就会出现错误。类似,但还是有很多细节的区别的。那么如何求最大深度呢?原创 2023-09-24 19:49:21 · 70 阅读 · 0 评论 -
算法60天训练–9-19-day14
int value;原创 2023-09-20 00:26:42 · 56 阅读 · 0 评论 -
算法60天训练–9-18-day13
因为要求滑动窗口中的最大值,原创 2023-09-19 01:09:48 · 58 阅读 · 0 评论 -
算法60天训练–9-15-day10
时间复杂度: push和empty为O(1), pop和peek为O(n)而栈是先进后出,而如果想用栈实现队列,就可以尝试用两个栈。满足先进后出的方法就是;入队列之后,就将这个数放到队首。首先应该先明确队列是先进先出,因此,可以使用两个队列来实现栈。空间复杂度: O(n)队列是先进先出原则,原创 2023-09-17 18:53:00 · 74 阅读 · 0 评论 -
算法60天训练–9-11-day6
第四步:否则继续向下判断:在set中是否出现过,如果出现过,说明这个数永远不能到1, 即不是一个快乐数. 如果没出现过,那么就将这个和。当我们需要查询一个元素是否出现过,或者一个元素是否在集合里的时候,就要第一时间想到哈希法。第二步: 然后再while(true)中无限循环,先求出一个数各单数平方的和相加。因为本题,我们不仅要知道元素有没有遍历过,还要知道这个元素对应的下标,简单的两层for循环,同时记录字符是否重复出现,很明显时间复杂度是。这样就将字符串s中字符出现的次数,统计出来了。原创 2023-09-14 22:37:23 · 82 阅读 · 0 评论 -
算法60天训练–9-13-day8
这是因为,这一步边界的判断是为了操作最后剩余的数,事实上,在for循环里,循环条件便是i < ch.length,所以到最后一步后,操作是统一的,都是。可以定义两个指针,从新数组最后往前遍历,和从老数组后往前遍历,这样可以省去从前往后每次遇到空格需要挪动数组的操作。个字符,所以可以定义一个指针 i ,来从起点,以2k的长度来遍历,数组的长度是需要扩大的,可以在原数组增大,或者创建一个新的数组。在遍历的同时,需要判断此时的位置是否超出字符串的长度。定义两个指针,分别初始化为指向左端点和指向右端点,原创 2023-09-14 01:11:16 · 116 阅读 · 1 评论 -
算法60天训练–9-9-day4
让index1和index2同时移动,每次移动一个节点, 那么他们相遇的地方就是 环形入口的节点。让fast先移动n位,然后再往后移动一位,之后和slow一起移动,直到fast指向为空。注意这里n一定是大于等于1的,因为 fast指针至少要多走一圈才能相遇slow指针。n为fast指针在环内走了n圈才遇到slow指针, (y+z)为 一圈内节点的个数A。也就是在相遇节点处,定义一个指针index1,在头结点处定一个指针index2。因为y+z是一圈,所以, 可将(n - 1) (y + z)看作0,原创 2023-09-13 00:35:55 · 109 阅读 · 1 评论 -
算法60天训练–9-6-day1
以right == left(两边顶点)为终止条件,根据左闭又开或左闭右闭来调整每一轮循环之后right和left两边端点的位置.始终将target在端点之间,直到right = left.,很满足二分法的使用条件,所以使用二分法来解决这道题,同时二分有两种情况,一种是左闭右闭,一种是左闭右开,而这两种情况在代码的形式上是不一样的.,如此循环,直到最右边,达到前面的等于2的元素被删除的目的.但是如果要减小时间复杂度,可以采用双指针解法。那么slow不动,fast向右移动,从题目中可以看出,数组中的元素是。原创 2023-09-10 15:54:06 · 129 阅读 · 1 评论 -
算法60天训练–9-8-day3
(画图有些不规范)原创 2023-09-10 02:04:31 · 100 阅读 · 1 评论 -
算法60天训练–9.7(day2)
是因为最后循环结束的时候StartX一定是在相对于第一条边中间的位置,那么循环了多少圈就可以由这个点对两边的竖边的条数进行分割.两边的条数一定是相等的,有就是转了多少圈.在数组两边定义两个指针,当左边的平方小于右边的平方,就往一个新数组放,放在最大索引处,然后左边++,同理,右边–.直到左边小于右边。本题无非就是遍历二维数组,一层层向里遍历,但是不统一规定遍历每一条边的边界,会非常的混乱。,在两边的平方要么是最大,要么是最小,一定是在两边,所以这时候可以用双指针,两层for循环,比较简单,不做演示。原创 2023-09-07 22:23:11 · 275 阅读 · 0 评论 -
算法60天训练:9.6 day1(数组)----二分查找
Problem: 704. 二分查找文章目录思路解题方法复杂度Code[JAVA]Code[C++]思路从题目中可以看出,数组中的元素是有序的,而且是不重复的,很满足二分法的使用条件,所以使用二分法来解决这道题,同时二分有两种情况,一种是左闭右闭,一种是左闭右开,而这两种情况在代码的形式上是不一样的.解题方法以right == left(两边顶点)为终止条件,根据左闭又开或左闭右闭来调整每一轮循环之后right和left两边端点的位置.始终将target在端点之间,直到right = l原创 2023-09-07 09:40:39 · 78 阅读 · 0 评论