LeetCode
文章平均质量分 57
基础算法刷题总结
我是真的菜啊啊
这个人很懒,什么都留下了
展开
-
48. 旋转图像
【代码】48. 旋转图像。原创 2023-02-26 20:35:00 · 114 阅读 · 0 评论 -
Trie树、字典树
208. 实现 Trie (前缀树)原创 2023-02-09 15:47:07 · 202 阅读 · 0 评论 -
回溯法、DFS、递归、栈、BFS知识点总结
回溯法、DFS、递归、栈、BFS知识点总结。原创 2022-10-23 20:05:45 · 676 阅读 · 0 评论 -
二分查找汇总
在于等号是和大于在一起还是小于在一起,以左边界举例的话就是每次边界收缩时 l指针mid+1左侧的mid一定是小于target的,这就保证了循环结束时 L指针的左侧必定和自己相异。如果左边界l要更新为 l = mid,此时我们就要使用模板2,让 mid = (l + r + 1)/ 2,否则while会陷入死循环。如果左边界l更新为l = mid + 1,此时我们就使用模板1,让mid = (l + r)/2。单调区间(非绝对单调,可有相等值)二分问题优先取r都不会翻车。时间复杂度O(lonN)原创 2022-10-20 21:57:18 · 527 阅读 · 0 评论 -
LeetCode 热题 HOT 100——31. 下一个排列
3. 如果最后没有找到nums[i] > nums[i-1]的,说明目前数组是倒序,Arrays.sort(nums)即可。时间复杂度:O( N*log(N) ),其中 N 为给定序列的长度,主要是Arrays.sort(nums)的复杂度,不考虑这个的话就是O(N)。1. 从后往前找出第一个相邻的后一个大于前一个元素:nums[i] > nums[i-1],此时的i-1位置就是需要交换的位置。2. 对i自己和之后的元素排序,[i,len)从小到大,第一个大于i-1位置的进行交换,那么就是下一个排列。原创 2022-09-18 17:05:59 · 172 阅读 · 0 评论 -
23. 合并K个升序链表
K 条链表的总结点数是 N,平均每条链表有 N/K 个节点,因此合并两条链表的时间复杂度是 O(N/K)。从 K 条链表开始两两合并成 1 条链表,因此每条链表都会被合并 logKlogK 次,因此 K 条链表会被合并 K * logK次,因此总共的时间复杂度是K∗logK∗N/K 即 O(NlogK)。使用小根堆维护 k 个链表的头部,每次 O(logK) 比较 K个链表的头结点 求 min,然后poll出来,若该 min 节点的 next 不为空,则继续加入到堆中,时间复杂度:O(NlogK)原创 2022-09-16 22:53:31 · 954 阅读 · 0 评论 -
回文子串汇总
一、中心扩展法:1. 以k为中心: left=k-1, right=k+12. 以k右边的空白位置为中心: left=k, right = k+1。原创 2022-09-15 11:25:30 · 1476 阅读 · 0 评论 -
239. 滑动窗口最大值
单调队列思路:0. 队列存储的是元素下标1. 遍历数组元素2. 维护队列:队列不为空并且当前遍历元素 >= 队尾元素,向前压,比它小的全部被压扁了(删除了),直至队列为空或者遇到比它大的元素,停止。4. 该元素下标入队5. 计算窗口左边界left6. 判断队首元素是否需要维护,如果 队首元素的下标 < left 说明该元素已经不在窗口内,可以从队列中清除7. 将窗口内的最大值存入数组(这里窗口内的最大值也即是队首元素)8. 返回操作1,直至退出循环。原创 2022-09-14 21:08:49 · 162 阅读 · 0 评论 -
前缀和总结
目录总结:523.连续子数组的和1. 学习到的知识点:2. 算法思想:525. 连续数组560. 和为 K 的子数组算法思路:974. 和可被 K 整除的子数组算法思路:1248. 统计「优美子数组」1. 学习到的知识点:2.算法思路:总结:①关于hashmap的初始化,求个数就存个数,哨兵存(0,1) 求长度就存下标,哨兵存(0,-1)②元素只有0、1的一般要初始化把0变化为-1③模板里面的hashmap.put的位置:if.....原创 2022-05-23 20:35:34 · 347 阅读 · 0 评论 -
961. 在长度 2N 的数组中找出重复 N 次的元素
目录961. 在长度 2N 的数组中找出重复 N 次的元素方法一、哈希表方法二、随机法思路与算法复杂度分析169. 多数元素方法一:哈希表方法二:排序返回中位数方法三:摩尔投票法方法三:随机化 ( 由于随机数可能每次都一样或者多次重复,实际复杂度有可能无穷大,一直找不到众数)思路算法961. 在长度 2N 的数组中找出重复 N 次的元素961. 在长度 2N 的数组中找出重复 N 次的元素方法一、哈希表2N个元素,N+1种,其中..原创 2022-05-21 16:20:50 · 475 阅读 · 0 评论 -
常见子数组问题 通用解法
1. 和积 最值问题第i位置的答案,一定由第i-1位置的答案发展而来,不用考虑i-2,i-3...因此用普通dp,可以做到O(n)。53. 最大子数组和普通DP。因为它向前扩展必连上dp[i-1],考虑dp[i-2]的话就不是连续子数组了。 有一个更优解法判断 sum 是否大于0的,其实就是化简后的普通DP(贪心算法)。53. 最大子数组和public class Solution { public int maxSubArray(int[] nums) {...原创 2022-05-20 17:29:26 · 702 阅读 · 0 评论 -
462. 最少移动次数使数组元素相等 II
462. 最少移动次数使数组元素相等 II学习到的知识点:1. 数组长度为 奇数 2n+1 则中位数两边各有n个数 设左边所有数和中位数的差值和为x 右边所有数和中位数的差值和为y 则所有需要移动的次数为x+y;如果不选择中位数 例如选择中位数-1 这样总的移动次数 >= ((x-n) + (y+n) + 1);也即 最好的情况下比中位数大1 。2. 如果数组长度是偶数 有两个中位数 选择两个中位数的任何一个或者两个中位数的平均数 都是可以的3. 另外就是求移动次数的时候,除了使用原创 2022-05-19 10:29:02 · 212 阅读 · 0 评论 -
378. 有序矩阵中第 K 小的元素
378. 有序矩阵中第 K 小的元素方法一:直接排序思路及算法最直接的做法是将这个二维数组转成一维数组,并对该一维数组进行排序。最后这个一维数组中的第k个数即为答案。class Solution { public int kthSmallest(int[][] matrix, int k) { int rows = matrix.length, columns = matrix[0].length; int[] sorted = ne....原创 2022-05-18 17:27:28 · 128 阅读 · 0 评论 -
面试题 01.05. 一次编辑
面试题 01.05. 一次编辑方法一:DP1、dp数组定义dp[ i ] [ j ] 表示以i-1,j-1结尾的两个字符串的需要最小的编辑距离。存在一次编辑的时候一共有四种情况:1. len ( str1) > len ( str2) , 相当于str2需要增加一个字符,或者 str1 删除一个字符。2. len ( str1 ) == len ( str2 ),相当于替换str1一个字符, 或者替换 str2 一个字符。3. len ( str1) <..原创 2022-05-14 10:23:46 · 169 阅读 · 0 评论 -
15.三数之和
15. 三数之和重点要保证:1. target不能重复2. 组成target的元组也不能重复然后固定target,剩余两个用双指针class Solution { public List<List<Integer>> threeSum(int[] nums) { List<List<Integer>> ans = new ArrayList<>(); if (nums == n...原创 2022-05-12 21:47:13 · 119 阅读 · 0 评论 -
1823.找出游戏的获胜者(约瑟夫环问题)
1823. 找出游戏的获胜者方法一:模拟 + 队列时间O(NM),空间O(N)(队列)class Solution { //队列 + 模拟 public int findTheWinner(int n, int k) { Queue<Integer> queue = new ArrayDeque<Integer>(); for (int i = 1; i <= n; i++) queue.offer(i); .原创 2022-05-05 10:57:25 · 286 阅读 · 0 评论 -
104. 二叉树的最大/最小深度
二叉树的最大深度和最小深度原创 2022-04-27 20:45:41 · 224 阅读 · 0 评论 -
116.填充每个节点的下一个右侧节点指针
116. 填充每个节点的下一个右侧节点指针说人话:为二叉树增加next指针。方法一:利用队列进行层序遍历,遍历的同时修改next指针。时空都是O(N)class Solution { //队列 + 层序遍历 public Node connect(Node root) { if(root == null) return root; Queue<Node> queue = new LinkedList<Node>原创 2022-04-27 20:04:56 · 537 阅读 · 0 评论 -
剑指 Offer 05. 替换空格
剑指 Offer 05. 替换空格主要涉及内容:字符串、字符数组、字符串中的字符替换涉及函数:s.toCharArray();s.charAt();char[] ans = new char[3*n];String str = new String(ans, i, j); //截取字符数组[i,j)范围内的元素到一个字符串。class Solution { public String replaceSpace(String s) { int n = s.原创 2022-04-08 16:57:20 · 207 阅读 · 0 评论 -
91. 解码方法
91. 解码方法上楼梯的复杂版①如果用 i 位置单独编码(假设符合编码条件):dp[i] = dp[i - 1]; 此时i位置不能为0②如果用 i 和 i-1 位置编码(假设符合编码条件): 1. i 位置不为0,可分为两个数单独编码,dp[i] = dp[i - 1] + dp[i - 2]; 2. i 位置为0,只能两个数字一起编码, dp[i] = dp[i - 2];②的两种情况可以合并为dp[i] = dp[i] + dp[i-...原创 2022-04-20 21:07:36 · 263 阅读 · 0 评论 -
单调栈专题
题型一:栈内记录元素496. 下一个更大元素 I思想:单调栈 + 哈希表栈中存储的是元素,不是位置信息。class Solution { public int[] nextGreaterElement(int[] nums1, int[] nums2) { int[] stack = new int[nums2.length];//模拟栈 int[] ans = new int[nums1.length]; //存储最终结果原创 2022-04-19 10:11:18 · 167 阅读 · 0 评论 -
150.逆波兰表达式求值
150. 逆波兰表达式求值考察内容:1. 栈的应用,遇到数字入栈,遇到字符就出栈两个数字做运算,再将结果压入栈中,最后返回栈底元素。2. 数组模拟栈,index变化是一个技巧点。3. 字符型数字转变为整数型数字装箱拆箱操作。class Solution { //遇到数字则入栈;遇到算符则取出栈顶两个数字进行计算,并将结果压入栈中。 public static int evalRPN(String[] tokens) { //纯数组模拟栈实现 int[] nu..原创 2022-04-17 10:06:39 · 144 阅读 · 0 评论 -
数组填充或者字符串填充
剑指 Offer 05. 替换空格思路如果想把这道题目做到极致,就不要只用额外的辅助空间了!首先扩充数组到每个空格替换成"%20"之后的大小。然后从后向前替换空格,也就是双指针法,过程如下:i指向新长度的末尾,j指向旧长度的末尾。分析从前向后填充就是$O(n^2)$的算法了,因为每次添加元素都要将添加元素之后的所有元素向后移动。其实很多数组填充类的问题,都可以先预先给数组扩容带填充后的大小,然后在从后向前进行操作。这么做有两个好处:不用申请新数组。 从后向前原创 2022-04-11 17:46:46 · 339 阅读 · 0 评论 -
459.重复的子字符串
459. 重复的子字符串方法一、简单移位法如果字符串 S 包含一个重复的子字符串,那么可以通过多次 “移位字符串S,并使其与原始字符串匹配。例如:abcabc右移位一次(环):cabcab右移位两次(环):bcabca右移位三次(环):abcabc现在字符串和原字符串匹配了,所以可以得出结论存在重复的子串。为了避免这种无用的环绕,可以创建一个新的字符串 str,它等于原来的字符串S + S ,这样其实就包含了所有移动的字符串。所以可以直接判断 str 中去除首尾元素之后,是否包含原创 2022-04-11 16:18:18 · 400 阅读 · 0 评论 -
原地哈希思路
41. 缺失的第一个正数原地哈希就相当于,让每个数字n都回到下标为n-1的家里。而那些没有回到家里的就成了孤魂野鬼流浪在外,他们要么是根本就没有自己的家(数字小于等于0或者大于nums.size()),要么是自己的家被别人占领了(出现了重复)。这些流浪汉被临时安置在下标为i的空房子里,之所以有空房子是因为房子i的主人i+1失踪了(数字i+1缺失)。因此通过原地构建哈希让各个数字回家,我们就可以找到原始数组中重复的数字还有消失的数字。题解来自力扣作者:xph123题解来自publ原创 2022-04-10 17:46:02 · 322 阅读 · 0 评论 -
翻转字符串总结
整体翻转344.反转字符串(opens new window)使用了双指针法。将元素组合分段,然后段内翻转541. 反转字符串II(opens new window)给反转加上了一些条件,当需要固定规律一段一段去处理字符串的时候,要想想在for循环的表达式上做做文章。字符串数组进行翻转(相当于将元素组合分段,然后段间翻转)151.翻转字符串里的单词(opens new window)对字符串数组里的单词顺序进行反转,发现先整体反转再局部反转是一个很妙的思路。剑指 O...原创 2022-04-09 10:52:24 · 1174 阅读 · 0 评论 -
KMP算法
下标i之前(包括i)的字符串中,有多大长度的相同前缀后缀。KMP的经典思想就是:当出现字符串不匹配时,可以记录一部分之前已经匹配的文本内容,利用这些信息避免从头再去做匹配。...原创 2022-04-10 15:56:44 · 219 阅读 · 0 评论 -
122.买卖股票的最佳时机 II
题目描述:方法一:DP第 1 步:定义状态dp[i][j] 表示到下标为 i 的这一天,持股状态为 j 时,我们手上拥有的最大现金数。注意:限定持股状态为 j 是为了方便推导状态转移方程,满足无后效性。第一维 i 表示下标为 i 的那一天( 具有前缀性质,即考虑了之前天数的交易 );第二维 j 表示下标为 i 的那一天是持有股票,还是持有现金。这里 0 表示持有现金(cash),1 表示持有股票(stock)。第 2步:确定初始值不持有股票,dp[0][0] = 0;.原创 2022-04-08 16:21:02 · 381 阅读 · 0 评论 -
454.四数相加2
分组 + 哈希表454. 四数相加 II这里主要是利用分组+哈希表的方法解决四数之和,O(n4)降低到O(n2):先计算A、B数组元素的和有多少种情况,再看C、D数组的和有哪些等于-sumAB,统计哈希表中,满足条件的sumAB对应的value。class Solution { public int fourSumCount(int[] A, int[] B, int[] C, int[] D) { Map<Integer, Integer> map原创 2022-04-07 20:08:44 · 235 阅读 · 0 评论 -
202. 快乐数
方法一:用哈希集合检测循环根据题意推测会有以下三种可能:最终会得到1。 最终会进入循环。 值会越来越大,最后接近无穷大。对于 3位数的数字,它不可能大于 243。这意味着它要么被困在 243 以下的循环内,要么跌到 1。4位或 4 位以上的数字在每一步都会丢失一位,直到降到 3 位为止。所以我们知道,最坏的情况下,算法可能会在 243以下的所有数字上循环,然后回到它已经到过的一个循环或者回到 1。但它不会无限期地进行下去,所以我们排除第三种选择。算法给一个数字...原创 2022-04-06 21:51:33 · 353 阅读 · 0 评论 -
189.轮转数组
189. 轮转数组给你一个数组,将数组中的元素向右轮转 k个位置,其中k是非负数。示例 1:输入: nums = [1,2,3,4,5,6,7], k = 3输出: [5,6,7,1,2,3,4]解释:向右轮转 1 步: [7,1,2,3,4,5,6]向右轮转 2 步: [6,7,1,2,3,4,5]向右轮转 3 步: [5,6,7,1,2,3,4]分析:k < 0时:不变k<n时:移动k步k=n时:相当于不动。k>n时:相当于动了k%n...原创 2022-04-04 15:03:06 · 249 阅读 · 0 评论 -
K个一组翻转链表
25. K 个一组翻转链表输入:head = [1,2,3,4,5], k = 2输出:[2,1,4,3,5]核心思想:链表翻转 + 拼接细节class Solution { public ListNode reverseKGroup(ListNode head, int k) { if (head == null || head.next == null){ return head; } //虚拟..原创 2022-04-03 17:02:59 · 436 阅读 · 0 评论 -
打家劫舍问题汇总
打家劫舍 II198. 打家劫舍①dp数组定义:dp[i]代表前i个房子在满足条件下的能偷窃到的最高金额。②问题情况:如果将nums[i] 加入最终的结果中那么nums[i-1]将不能加入——>dp[i] = dp[i-2] + nums[i]如果nums[i]可以偷但没有偷——>dp[i] = dp[i-1]③dp数组的状态转换方程:dp[i] = max(dp[i-2]+nums[i], dp[i-1])④返回值:dp[n-1]的值⑤空...原创 2022-04-01 20:10:00 · 1113 阅读 · 0 评论 -
螺旋矩阵题型汇总(边界处理)
54螺旋矩阵59螺旋矩阵 IIleetcode54螺旋矩阵题解(59题与54题解法相同,长方形与正方形都适用):方法1:模拟法classSolution{publicstaticList<Integer>spiralOrder(int[][]matrix){intm=matrix.length,n=matrix[0].length;intl=0,t=0,r=n-1,b=m-...原创 2022-04-01 16:10:30 · 91 阅读 · 0 评论 -
滑动窗口/左右指针/快慢指针
快慢指针:1、判定链表中是否含有环2、已知链表中含有环,返回这个环的起始位置3、寻找链表的倒数第n个元素LeetCode双指针例题27(easy)移除元素左右指针:二分查找滑动窗口:①使用滑动窗口解题的场景:问题本身和能 单调性 建立关系,窗口内就是解决单调性的。②看到题目能跟单调性扯上关系,那么立即想到滑动窗口、首尾指针法、单调栈、单调队列。③滑动窗口的实现可以基于双端队列,也可以基于左右指针,优先考虑左右指针更节省空间,但是如果需要对窗口中的元..原创 2022-03-31 11:32:07 · 260 阅读 · 0 评论