type
status
date
slug
summary
tags
category
icon
password
comment
😀
2025.5.8 其实之前已经做了一些内容了,只是没系统整理,这里理论知识实际上都过了一遍,现在要系统性地刷题了,打算从力扣hot100和代码随想录入手,之后如果有时间再刷刷洛谷的
理论内容数组专题二分搜索移除元素有序数组的平方长度最小的子数组螺旋矩阵II链表专题移除链表元素设计链表反转链表两两交换链表中的节点删除链表的倒数第 N 个结点链表相交环形链表 II哈希表专题有效的字母异位词两个数组的交集快乐数两数之和四数相加 II赎金信三数之和四数之和字符串专题反转字符串反转字符串 II替换数字反转字符串中的单词右旋字符串找出字符串中第一个匹配项的下标(KMP)重复的子字符串(KMP)栈与队列专题用栈实现队列用队列实现栈有效的括号删除字符串中的所有相邻重复项逆波兰表达式求值滑动窗口最大值(单调队列)前 K 个高频元素(优先级队列)树与二叉树专题二叉树的递归遍历与迭代遍历二叉树层序遍历翻转二叉树对称二叉树完全二叉树的节点个数平衡二叉树二叉树的所有路径左叶子之和找树左下角的值路径总和从中序与后序遍历序列构造二叉树最大二叉树合并二叉树二叉搜索树中的搜索验证二叉搜索树二叉搜索树的最小绝对差二叉搜索树中的众数二叉树的最近公共祖先二叉搜索树的最近公共祖先二叉搜索树中的插入操作删除二叉搜索树中的节点修剪二叉搜索树将有序数组转换为二叉搜索树把二叉搜索树转换为累加树回溯专题组合组合总和 III电话号码的字母组合组合总和组合总和 II分割回文串复原 IP 地址子集子集 II非递减子序列全排列全排列 IIN皇后问题解数独贪心算法分发饼干摆动序列最大子数组和买卖股票的最佳时机 II跳跃游戏跳跃游戏 IIK 次取反后最大化的数组和加油站分发糖果柠檬水找零根据身高重建队列用最少数量的箭引爆气球无重叠区间划分字母区间合并区间单调递增的数字监控二叉树动态规划斐波那契数爬楼梯使用最小花费爬楼梯不同路径不同路径 II整数拆分不同的二叉搜索树0-1 背包问题分割等和子集最后一块石头的重量 II目标和一和零携带研究材料零钱兑换 II组合总和 Ⅳ爬楼梯(进阶版)零钱兑换完全平方数单词拆分打家劫舍打家劫舍 II打家劫舍 III买卖股票的最佳时机买卖股票的最佳时机 II买卖股票的最佳时机 III买卖股票的最佳时机 IV买卖股票的最佳时机含冷冻期买卖股票的最佳时机含手续费最长递增子序列最长递增子序列最长连续递增序列最长重复子数组最长公共子序列不相交的线最大子数组和判断子序列不同的子序列两个字符串的删除操作编辑距离回文子串最长回文子序列单调栈每日温度下一个更大元素 I下一个更大元素 II接雨水柱状图中最大的矩形图论所有可达路径所有可能的路径岛屿数量岛屿的最大面积孤岛的总面积沉没孤岛水流问题建造最大岛屿岛屿的周长单词接龙有向图的完全联通并查集类定义寻找图中是否存在路径冗余连接冗余连接 II寻宝软件构建参加科学大会城市间货物运输 I小明逛公园A*搜索算法

理论内容

我的Acwing笔记:
代码随想录:代码随想录
 
 

数组专题

二分搜索

常见易错点:
1.while内左右循环变量是否要加=
2.缩小区间时right=middle-1或者middle
解决方案:注意常见区间时左闭右闭还是左闭右开
左闭右闭:right=nums.size-1,while循环内加=,right=middle-1,left=middle+1
左闭右开:right=nums.size,while循环内left < right, right=middle, left=middle+1
 

移除元素

27. 移除元素 - 力扣(LeetCode)
27. 移除元素 - 给你一个数组 nums 和一个值 val,你需要 原地 [https://baike.baidu.com/item/%E5%8E%9F%E5%9C%B0%E7%AE%97%E6%B3%95] 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。 假设 nums 中不等于 val 的元素数量为 k,要通过此题,您需要执行以下操作: * 更改 nums 数组,使 nums 的前 k 个元素包含不等于 val 的元素。nums 的其余元素和 nums 的大小并不重要。 * 返回 k。 用户评测: 评测机将使用以下代码测试您的解决方案: int[] nums = [...]; // 输入数组 int val = ...; // 要移除的值 int[] expectedNums = [...]; // 长度正确的预期答案。 // 它以不等于 val 的值排序。 int k = removeElement(nums, val); // 调用你的实现 assert k == expectedNums.length; sort(nums, 0, k); // 排序 nums 的前 k 个元素 for (int i = 0; i < actualLength; i++) { assert nums[i] == expectedNums[i]; } 如果所有的断言都通过,你的解决方案将会 通过。   示例 1: 输入:nums = [3,2,2,3], val = 3 输出:2, nums = [2,2,_,_] 解释:你的函数函数应该返回 k = 2, 并且 nums 中的前两个元素均为 2。 你在返回的 k 个元素之外留下了什么并不重要(因此它们并不计入评测)。 示例 2: 输入:nums = [0,1,2,2,3,0,4,2], val = 2 输出:5, nums = [0,1,4,0,3,_,_,_] 解释:你的函数应该返回 k = 5,并且 nums 中的前五个元素为 0,0,1,3,4。 注意这五个元素可以任意顺序返回。 你在返回的 k 个元素之外留下了什么并不重要(因此它们并不计入评测)。   提示: * 0 <= nums.length <= 100 * 0 <= nums[i] <= 50 * 0 <= val <= 100
27. 移除元素 - 力扣(LeetCode)
 

有序数组的平方

 

长度最小的子数组

 

螺旋矩阵II

 

链表专题

移除链表元素

 

设计链表

707. 设计链表 - 力扣(LeetCode)
707. 设计链表 - 你可以选择使用单链表或者双链表,设计并实现自己的链表。 单链表中的节点应该具备两个属性:val 和 next 。val 是当前节点的值,next 是指向下一个节点的指针/引用。 如果是双向链表,则还需要属性 prev 以指示链表中的上一个节点。假设链表中的所有节点下标从 0 开始。 实现 MyLinkedList 类: * MyLinkedList() 初始化 MyLinkedList 对象。 * int get(int index) 获取链表中下标为 index 的节点的值。如果下标无效,则返回 -1 。 * void addAtHead(int val) 将一个值为 val 的节点插入到链表中第一个元素之前。在插入完成后,新节点会成为链表的第一个节点。 * void addAtTail(int val) 将一个值为 val 的节点追加到链表中作为链表的最后一个元素。 * void addAtIndex(int index, int val) 将一个值为 val 的节点插入到链表中下标为 index 的节点之前。如果 index 等于链表的长度,那么该节点会被追加到链表的末尾。如果 index 比长度更大,该节点将 不会插入 到链表中。 * void deleteAtIndex(int index) 如果下标有效,则删除链表中下标为 index 的节点。   示例: 输入 ["MyLinkedList", "addAtHead", "addAtTail", "addAtIndex", "get", "deleteAtIndex", "get"] [[], [1], [3], [1, 2], [1], [1], [1]] 输出 [null, null, null, null, 2, null, 3] 解释 MyLinkedList myLinkedList = new MyLinkedList(); myLinkedList.addAtHead(1); myLinkedList.addAtTail(3); myLinkedList.addAtIndex(1, 2); // 链表变为 1->2->3 myLinkedList.get(1); // 返回 2 myLinkedList.deleteAtIndex(1); // 现在,链表变为 1->3 myLinkedList.get(1); // 返回 3   提示: * 0 <= index, val <= 1000 * 请不要使用内置的 LinkedList 库。 * 调用 get、addAtHead、addAtTail、addAtIndex 和 deleteAtIndex 的次数不超过 2000 。
707. 设计链表 - 力扣(LeetCode)
 

反转链表

 

两两交换链表中的节点

 

删除链表的倒数第 N 个结点

 

链表相交

面试题 02.07. 链表相交 - 力扣(LeetCode)
面试题 02.07. 链表相交 - 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。 图示两个链表在节点 c1 开始相交: [https://assets.leetcode-cn.com/aliyun-lc-upload/uploads/2018/12/14/160_statement.png] [https://assets.leetcode-cn.com/aliyun-lc-upload/uploads/2018/12/14/160_statement.png] 题目数据 保证 整个链式结构中不存在环。 注意,函数返回结果后,链表必须 保持其原始结构 。   示例 1: [https://assets.leetcode-cn.com/aliyun-lc-upload/uploads/2018/12/14/160_example_1.png] [https://assets.leetcode.com/uploads/2018/12/13/160_example_1.png] 输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3 输出:Intersected at '8' 解释:相交节点的值为 8 (注意,如果两个链表相交则不能为 0)。 从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。 在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。 示例 2: [https://assets.leetcode-cn.com/aliyun-lc-upload/uploads/2018/12/14/160_example_2.png] [https://assets.leetcode.com/uploads/2018/12/13/160_example_2.png] 输入:intersectVal = 2, listA = [0,9,1,2,4], listB = [3,2,4], skipA = 3, skipB = 1 输出:Intersected at '2' 解释:相交节点的值为 2 (注意,如果两个链表相交则不能为 0)。 从各自的表头开始算起,链表 A 为 [0,9,1,2,4],链表 B 为 [3,2,4]。 在 A 中,相交节点前有 3 个节点;在 B 中,相交节点前有 1 个节点。 示例 3: [https://assets.leetcode-cn.com/aliyun-lc-upload/uploads/2018/12/14/160_example_3.png] [https://assets.leetcode.com/uploads/2018/12/13/160_example_3.png] 输入:intersectVal = 0, listA = [2,6,4], listB = [1,5], skipA = 3, skipB = 2 输出:null 解释:从各自的表头开始算起,链表 A 为 [2,6,4],链表 B 为 [1,5]。 由于这两个链表不相交,所以 intersectVal 必须为 0,而 skipA 和 skipB 可以是任意值。 这两个链表不相交,因此返回 null 。   提示: * listA 中节点数目为 m * listB 中节点数目为 n * 0 <= m, n <= 3 * 104 * 1 <= Node.val <= 105 * 0 <= skipA <= m * 0 <= skipB <= n * 如果 listA 和 listB 没有交点,intersectVal 为 0 * 如果 listA 和 listB 有交点,intersectVal == listA[skipA + 1] == listB[skipB + 1]   进阶:你能否设计一个时间复杂度 O(n) 、仅用 O(1) 内存的解决方案?
面试题 02.07. 链表相交 - 力扣(LeetCode)
 

环形链表 II

142. 环形链表 II - 力扣(LeetCode)
142. 环形链表 II - 给定一个链表的头节点  head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。 不允许修改 链表。   示例 1: [https://assets.leetcode.com/uploads/2018/12/07/circularlinkedlist.png] 输入:head = [3,2,0,-4], pos = 1 输出:返回索引为 1 的链表节点 解释:链表中有一个环,其尾部连接到第二个节点。 示例 2: [https://assets.leetcode-cn.com/aliyun-lc-upload/uploads/2018/12/07/circularlinkedlist_test2.png] 输入:head = [1,2], pos = 0 输出:返回索引为 0 的链表节点 解释:链表中有一个环,其尾部连接到第一个节点。 示例 3: [https://assets.leetcode-cn.com/aliyun-lc-upload/uploads/2018/12/07/circularlinkedlist_test3.png] 输入:head = [1], pos = -1 输出:返回 null 解释:链表中没有环。   提示: * 链表中节点的数目范围在范围 [0, 104] 内 * -105 <= Node.val <= 105 * pos 的值为 -1 或者链表中的一个有效索引   进阶:你是否可以使用 O(1) 空间解决此题?
142. 环形链表 II - 力扣(LeetCode)
 

哈希表专题

有效的字母异位词

 

两个数组的交集

 

快乐数

 

两数之和

 

四数相加 II

 

赎金信

 

三数之和

 

四数之和

 

字符串专题

反转字符串

 

反转字符串 II

 

替换数字

 

反转字符串中的单词

 

右旋字符串

 

找出字符串中第一个匹配项的下标(KMP)

 

重复的子字符串(KMP)

 

栈与队列专题

用栈实现队列

232. 用栈实现队列 - 力扣(LeetCode)
232. 用栈实现队列 - 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty): 实现 MyQueue 类: * void push(int x) 将元素 x 推到队列的末尾 * int pop() 从队列的开头移除并返回元素 * int peek() 返回队列开头的元素 * boolean empty() 如果队列为空,返回 true ;否则,返回 false 说明: * 你 只能 使用标准的栈操作 —— 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。 * 你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。   示例 1: 输入: ["MyQueue", "push", "push", "peek", "pop", "empty"] [[], [1], [2], [], [], []] 输出: [null, null, null, 1, 1, false] 解释: MyQueue myQueue = new MyQueue(); myQueue.push(1); // queue is: [1] myQueue.push(2); // queue is: [1, 2] (leftmost is front of the queue) myQueue.peek(); // return 1 myQueue.pop(); // return 1, queue is [2] myQueue.empty(); // return false   提示: * 1 <= x <= 9 * 最多调用 100 次 push、pop、peek 和 empty * 假设所有操作都是有效的 (例如,一个空的队列不会调用 pop 或者 peek 操作)   进阶: * 你能否实现每个操作均摊时间复杂度为 O(1) 的队列?换句话说,执行 n 个操作的总时间复杂度为 O(n) ,即使其中一个操作可能花费较长时间。
232. 用栈实现队列 - 力扣(LeetCode)
 

用队列实现栈

 

有效的括号

 

删除字符串中的所有相邻重复项

 

逆波兰表达式求值

150. 逆波兰表达式求值 - 力扣(LeetCode)
150. 逆波兰表达式求值 - 给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 [https://baike.baidu.com/item/%E9%80%86%E6%B3%A2%E5%85%B0%E5%BC%8F/128437] 表示的算术表达式。 请你计算该表达式。返回一个表示表达式值的整数。 注意: * 有效的算符为 '+'、'-'、'*' 和 '/' 。 * 每个操作数(运算对象)都可以是一个整数或者另一个表达式。 * 两个整数之间的除法总是 向零截断 。 * 表达式中不含除零运算。 * 输入是一个根据逆波兰表示法表示的算术表达式。 * 答案及所有中间计算结果可以用 32 位 整数表示。   示例 1: 输入:tokens = ["2","1","+","3","*"] 输出:9 解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9 示例 2: 输入:tokens = ["4","13","5","/","+"] 输出:6 解释:该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 6 示例 3: 输入:tokens = ["10","6","9","3","+","-11","*","/","*","17","+","5","+"] 输出:22 解释:该算式转化为常见的中缀算术表达式为: ((10 * (6 / ((9 + 3) * -11))) + 17) + 5 = ((10 * (6 / (12 * -11))) + 17) + 5 = ((10 * (6 / -132)) + 17) + 5 = ((10 * 0) + 17) + 5 = (0 + 17) + 5 = 17 + 5 = 22   提示: * 1 <= tokens.length <= 104 * tokens[i] 是一个算符("+"、"-"、"*" 或 "/"),或是在范围 [-200, 200] 内的一个整数   逆波兰表达式: 逆波兰表达式是一种后缀表达式,所谓后缀就是指算符写在后面。 * 平常使用的算式则是一种中缀表达式,如 ( 1 + 2 ) * ( 3 + 4 ) 。 * 该算式的逆波兰表达式写法为 ( ( 1 2 + ) ( 3 4 + ) * ) 。 逆波兰表达式主要有以下两个优点: * 去掉括号后表达式无歧义,上式即便写成 1 2 + 3 4 + * 也可以依据次序计算出正确结果。 * 适合用栈操作运算:遇到数字则入栈;遇到算符则取出栈顶两个数字进行计算,并将结果压入栈中
150. 逆波兰表达式求值 - 力扣(LeetCode)
 

滑动窗口最大值(单调队列)

 

前 K 个高频元素(优先级队列)

 

树与二叉树专题

二叉树的递归遍历与迭代遍历

 
 
 

二叉树层序遍历

 
 
 
 
 
 
 
 
 
 

翻转二叉树

 

对称二叉树

 

完全二叉树的节点个数

 

平衡二叉树

 

二叉树的所有路径

 

左叶子之和

 

找树左下角的值

 

路径总和

 

从中序与后序遍历序列构造二叉树

 

最大二叉树

 

合并二叉树

 

二叉搜索树中的搜索

 

验证二叉搜索树

 

二叉搜索树的最小绝对差

 

二叉搜索树中的众数

 

二叉树的最近公共祖先

 

二叉搜索树的最近公共祖先

 

二叉搜索树中的插入操作

 

删除二叉搜索树中的节点

 

修剪二叉搜索树

 

将有序数组转换为二叉搜索树

 

把二叉搜索树转换为累加树

 

回溯专题

组合

 

组合总和 III

 

电话号码的字母组合

 

组合总和

 

组合总和 II

 

分割回文串

 

复原 IP 地址

 

子集

 

子集 II

 

非递减子序列

 

全排列

 

全排列 II

 

N皇后问题

 

解数独

37. 解数独 - 力扣(LeetCode)
37. 解数独 - 编写一个程序,通过填充空格来解决数独问题。 数独的解法需 遵循如下规则: 1. 数字 1-9 在每一行只能出现一次。 2. 数字 1-9 在每一列只能出现一次。 3. 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图) 数独部分空格内已填入了数字,空白格用 '.' 表示。   示例 1: [https://assets.leetcode-cn.com/aliyun-lc-upload/uploads/2021/04/12/250px-sudoku-by-l2g-20050714svg.png] 输入:board = [["5","3",".",".","7",".",".",".","."],["6",".",".","1","9","5",".",".","."],[".","9","8",".",".",".",".","6","."],["8",".",".",".","6",".",".",".","3"],["4",".",".","8",".","3",".",".","1"],["7",".",".",".","2",".",".",".","6"],[".","6",".",".",".",".","2","8","."],[".",".",".","4","1","9",".",".","5"],[".",".",".",".","8",".",".","7","9"]] 输出:[["5","3","4","6","7","8","9","1","2"],["6","7","2","1","9","5","3","4","8"],["1","9","8","3","4","2","5","6","7"],["8","5","9","7","6","1","4","2","3"],["4","2","6","8","5","3","7","9","1"],["7","1","3","9","2","4","8","5","6"],["9","6","1","5","3","7","2","8","4"],["2","8","7","4","1","9","6","3","5"],["3","4","5","2","8","6","1","7","9"]] 解释:输入的数独如上图所示,唯一有效的解决方案如下所示: [ https://assets.leetcode-cn.com/aliyun-lc-upload/uploads/2021/04/12/250px-sudoku-by-l2g-20050714_solutionsvg.png]   提示: * board.length == 9 * board[i].length == 9 * board[i][j] 是一位数字或者 '.' * 题目数据 保证 输入数独仅有一个解
37. 解数独 - 力扣(LeetCode)
 

贪心算法

分发饼干

 

摆动序列

 

最大子数组和

 

买卖股票的最佳时机 II

 

跳跃游戏

 

跳跃游戏 II

 

K 次取反后最大化的数组和

 

加油站

134. 加油站 - 力扣(LeetCode)
134. 加油站 - 在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。 给定两个整数数组 gas 和 cost ,如果你可以按顺序绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1 。如果存在解,则 保证 它是 唯一 的。   示例 1: 输入: gas = [1,2,3,4,5], cost = [3,4,5,1,2] 输出: 3 解释: 从 3 号加油站(索引为 3 处)出发,可获得 4 升汽油。此时油箱有 = 0 + 4 = 4 升汽油 开往 4 号加油站,此时油箱有 4 - 1 + 5 = 8 升汽油 开往 0 号加油站,此时油箱有 8 - 2 + 1 = 7 升汽油 开往 1 号加油站,此时油箱有 7 - 3 + 2 = 6 升汽油 开往 2 号加油站,此时油箱有 6 - 4 + 3 = 5 升汽油 开往 3 号加油站,你需要消耗 5 升汽油,正好足够你返回到 3 号加油站。 因此,3 可为起始索引。 示例 2: 输入: gas = [2,3,4], cost = [3,4,3] 输出: -1 解释: 你不能从 0 号或 1 号加油站出发,因为没有足够的汽油可以让你行驶到下一个加油站。 我们从 2 号加油站出发,可以获得 4 升汽油。 此时油箱有 = 0 + 4 = 4 升汽油 开往 0 号加油站,此时油箱有 4 - 3 + 2 = 3 升汽油 开往 1 号加油站,此时油箱有 3 - 3 + 3 = 3 升汽油 你无法返回 2 号加油站,因为返程需要消耗 4 升汽油,但是你的油箱只有 3 升汽油。 因此,无论怎样,你都不可能绕环路行驶一周。   提示: * gas.length == n * cost.length == n * 1 <= n <= 105 * 0 <= gas[i], cost[i] <= 104
134. 加油站 - 力扣(LeetCode)
 

分发糖果

 

柠檬水找零

860. 柠檬水找零 - 力扣(LeetCode)
860. 柠檬水找零 - 在柠檬水摊上,每一杯柠檬水的售价为 5 美元。顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯。 每位顾客只买一杯柠檬水,然后向你付 5 美元、10 美元或 20 美元。你必须给每个顾客正确找零,也就是说净交易是每位顾客向你支付 5 美元。 注意,一开始你手头没有任何零钱。 给你一个整数数组 bills ,其中 bills[i] 是第 i 位顾客付的账。如果你能给每位顾客正确找零,返回 true ,否则返回 false 。   示例 1: 输入:bills = [5,5,5,10,20] 输出:true 解释: 前 3 位顾客那里,我们按顺序收取 3 张 5 美元的钞票。 第 4 位顾客那里,我们收取一张 10 美元的钞票,并返还 5 美元。 第 5 位顾客那里,我们找还一张 10 美元的钞票和一张 5 美元的钞票。 由于所有客户都得到了正确的找零,所以我们输出 true。 示例 2: 输入:bills = [5,5,10,10,20] 输出:false 解释: 前 2 位顾客那里,我们按顺序收取 2 张 5 美元的钞票。 对于接下来的 2 位顾客,我们收取一张 10 美元的钞票,然后返还 5 美元。 对于最后一位顾客,我们无法退回 15 美元,因为我们现在只有两张 10 美元的钞票。 由于不是每位顾客都得到了正确的找零,所以答案是 false。   提示: * 1 <= bills.length <= 105 * bills[i] 不是 5 就是 10 或是 20
860. 柠檬水找零 - 力扣(LeetCode)
 

根据身高重建队列

406. 根据身高重建队列 - 力扣(LeetCode)
406. 根据身高重建队列 - 假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i] = [hi, ki] 表示第 i 个人的身高为 hi ,前面 正好 有 ki 个身高大于或等于 hi 的人。 请你重新构造并返回输入数组 people 所表示的队列。返回的队列应该格式化为数组 queue ,其中 queue[j] = [hj, kj] 是队列中第 j 个人的属性(queue[0] 是排在队列前面的人)。   示例 1: 输入:people = [[7,0],[4,4],[7,1],[5,0],[6,1],[5,2]] 输出:[[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]] 解释: 编号为 0 的人身高为 5 ,没有身高更高或者相同的人排在他前面。 编号为 1 的人身高为 7 ,没有身高更高或者相同的人排在他前面。 编号为 2 的人身高为 5 ,有 2 个身高更高或者相同的人排在他前面,即编号为 0 和 1 的人。 编号为 3 的人身高为 6 ,有 1 个身高更高或者相同的人排在他前面,即编号为 1 的人。 编号为 4 的人身高为 4 ,有 4 个身高更高或者相同的人排在他前面,即编号为 0、1、2、3 的人。 编号为 5 的人身高为 7 ,有 1 个身高更高或者相同的人排在他前面,即编号为 1 的人。 因此 [[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]] 是重新构造后的队列。 示例 2: 输入:people = [[6,0],[5,0],[4,0],[3,2],[2,2],[1,4]] 输出:[[4,0],[5,0],[2,2],[3,2],[1,4],[6,0]]   提示: * 1 <= people.length <= 2000 * 0 <= hi <= 106 * 0 <= ki < people.length * 题目数据确保队列可以被重建
406. 根据身高重建队列 - 力扣(LeetCode)
 

用最少数量的箭引爆气球

452. 用最少数量的箭引爆气球 - 力扣(LeetCode)
452. 用最少数量的箭引爆气球 - 有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points ,其中points[i] = [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。你不知道气球的确切 y 坐标。 一支弓箭可以沿着 x 轴从不同点 完全垂直 地射出。在坐标 x 处射出一支箭,若有一个气球的直径的开始和结束坐标为 xstart,xend, 且满足  xstart ≤ x ≤ xend,则该气球会被 引爆 。可以射出的弓箭的数量 没有限制 。 弓箭一旦被射出之后,可以无限地前进。 给你一个数组 points ,返回引爆所有气球所必须射出的 最小 弓箭数 。   示例 1: 输入:points = [[10,16],[2,8],[1,6],[7,12]] 输出:2 解释:气球可以用2支箭来爆破: -在x = 6处射出箭,击破气球[2,8]和[1,6]。 -在x = 11处发射箭,击破气球[10,16]和[7,12]。 示例 2: 输入:points = [[1,2],[3,4],[5,6],[7,8]] 输出:4 解释:每个气球需要射出一支箭,总共需要4支箭。 示例 3: 输入:points = [[1,2],[2,3],[3,4],[4,5]] 输出:2 解释:气球可以用2支箭来爆破: - 在x = 2处发射箭,击破气球[1,2]和[2,3]。 - 在x = 4处射出箭,击破气球[3,4]和[4,5]。   提示: * 1 <= points.length <= 105 * points[i].length == 2 * -231 <= xstart < xend <= 231 - 1
452. 用最少数量的箭引爆气球 - 力扣(LeetCode)
 

无重叠区间

 

划分字母区间

 

合并区间

 

单调递增的数字

 

监控二叉树

 

动态规划

斐波那契数

 

爬楼梯

 

使用最小花费爬楼梯

 

不同路径

 

不同路径 II

 

整数拆分

 

不同的二叉搜索树

 

0-1 背包问题

 

分割等和子集

 

最后一块石头的重量 II

 

目标和

 

一和零

 

携带研究材料

 

零钱兑换 II

 

组合总和 Ⅳ

 

爬楼梯(进阶版)

 

零钱兑换

 

完全平方数

 

单词拆分

 

打家劫舍

 

打家劫舍 II

 

打家劫舍 III

 

买卖股票的最佳时机

 

买卖股票的最佳时机 II

 

买卖股票的最佳时机 III

123. 买卖股票的最佳时机 III - 力扣(LeetCode)
123. 买卖股票的最佳时机 III - 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。   示例 1: 输入:prices = [3,3,5,0,0,3,1,4] 输出:6 解释:在第 4 天(股票价格 = 0)的时候买入,在第 6 天(股票价格 = 3)的时候卖出,这笔交易所能获得利润 = 3-0 = 3 。   随后,在第 7 天(股票价格 = 1)的时候买入,在第 8 天 (股票价格 = 4)的时候卖出,这笔交易所能获得利润 = 4-1 = 3 。 示例 2: 输入:prices = [1,2,3,4,5] 输出:4 解释:在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。     注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。     因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。 示例 3: 输入:prices = [7,6,4,3,1] 输出:0 解释:在这个情况下, 没有交易完成, 所以最大利润为 0。 示例 4: 输入:prices = [1] 输出:0   提示: * 1 <= prices.length <= 105 * 0 <= prices[i] <= 105
123. 买卖股票的最佳时机 III - 力扣(LeetCode)
 

买卖股票的最佳时机 IV

 

买卖股票的最佳时机含冷冻期

 

买卖股票的最佳时机含手续费

 

最长递增子序列

 

最长递增子序列

 

最长连续递增序列

 

最长重复子数组

 

最长公共子序列

 

不相交的线

 

最大子数组和

 

判断子序列

 

不同的子序列

 

两个字符串的删除操作

 

编辑距离

 

回文子串

 

最长回文子序列

 

单调栈

每日温度

 

下一个更大元素 I

496. 下一个更大元素 I - 力扣(LeetCode)
496. 下一个更大元素 I - nums1 中数字 x 的 下一个更大元素 是指 x 在 nums2 中对应位置 右侧 的 第一个 比 x 大的元素。 给你两个 没有重复元素 的数组 nums1 和 nums2 ,下标从 0 开始计数,其中nums1 是 nums2 的子集。 对于每个 0 <= i < nums1.length ,找出满足 nums1[i] == nums2[j] 的下标 j ,并且在 nums2 确定 nums2[j] 的 下一个更大元素 。如果不存在下一个更大元素,那么本次查询的答案是 -1 。 返回一个长度为 nums1.length 的数组 ans 作为答案,满足 ans[i] 是如上所述的 下一个更大元素 。   示例 1: 输入:nums1 = [4,1,2], nums2 = [1,3,4,2]. 输出:[-1,3,-1] 解释:nums1 中每个值的下一个更大元素如下所述: - 4 ,用加粗斜体标识,nums2 = [1,3,4,2]。不存在下一个更大元素,所以答案是 -1 。 - 1 ,用加粗斜体标识,nums2 = [1,3,4,2]。下一个更大元素是 3 。 - 2 ,用加粗斜体标识,nums2 = [1,3,4,2]。不存在下一个更大元素,所以答案是 -1 。 示例 2: 输入:nums1 = [2,4], nums2 = [1,2,3,4]. 输出:[3,-1] 解释:nums1 中每个值的下一个更大元素如下所述: - 2 ,用加粗斜体标识,nums2 = [1,2,3,4]。下一个更大元素是 3 。 - 4 ,用加粗斜体标识,nums2 = [1,2,3,4]。不存在下一个更大元素,所以答案是 -1 。   提示: * 1 <= nums1.length <= nums2.length <= 1000 * 0 <= nums1[i], nums2[i] <= 104 * nums1和nums2中所有整数 互不相同 * nums1 中的所有整数同样出现在 nums2 中   进阶:你可以设计一个时间复杂度为 O(nums1.length + nums2.length) 的解决方案吗?
496. 下一个更大元素 I - 力扣(LeetCode)
 

下一个更大元素 II

 

接雨水

 

柱状图中最大的矩形

 

图论

所有可达路径

 

所有可能的路径

 

岛屿数量

 

岛屿的最大面积

 

孤岛的总面积

 

沉没孤岛

 

水流问题

 

建造最大岛屿

 

岛屿的周长

 

单词接龙

 

有向图的完全联通

 

并查集类定义

 

寻找图中是否存在路径

 

冗余连接

 

冗余连接 II

 

寻宝

 

软件构建

 

参加科学大会

 

城市间货物运输 I

 

小明逛公园

 

A*搜索算法

Acwing算法基础课浅谈软件设计模式
Loading...
目录
0%
Samuel Hu
Samuel Hu
沪上985软工在读 喜欢写代码 爱折腾的混子
小红书
统计
文章数:
20
访问量:
访客数:
公告

🎉 博客升级公告 🎉

全新升级,更好体验!
网站经过两位🤡的破坏之前下架一段时间,给大家带来不便深表抱歉
经过一段时间的精心修缮,我的博客终于以全新面貌与大家见面啦!

🛠 主要更新

🔍 智能搜索
💬 评论功能
🛡 安全升级
📂 内容整理
💬 在线客服
感谢大家一直以来的支持!期待与您继续分享优质内容~
🚀 新旅程,新开始! 🚀
目录
0%