LeetCode
文章平均质量分 71
槑!
这个作者很懒,什么都没留下…
展开
-
【LeetCode】贪心算法:常见典例
贪心算法如果问题的最优解包含两个(或更多)子问题的最优解,且子问题多有重叠,我们考虑使用动态规划算法。而如果问题经过贪心选择后,只剩下一个子问题,且具有优化子结构,那么可以使用贪心算法。贪心选择性:每一步贪心选出来的一定是原问题的最优解的一部分(即每次求的最优解一定会被更大的父问题选择,即被父节点选择)关键点就在于这个性质,就是说怎么证明父状态转移到的这唯一一个子状态就是父状态要使用的最优解最优子结构:每一步贪心选完后会留下子问题,子问题的最优解和贪心选出来的解可以凑成原问题的最优解贪心算法原创 2021-02-12 13:22:24 · 1014 阅读 · 0 评论 -
【LeetCode】动态规划问题:LCS 与 LIS 问题
LIS 问题300. 最长递增子序列给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。示例 1:输入:nums = [10,9,2,5,3,7,101,18]输出:4解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。示例 2:输入:nums = [0,1,0,3,2,3]输出:4示例 3:输入:原创 2021-02-12 13:22:02 · 448 阅读 · 0 评论 -
【LeetCode】动态规划问题:背包问题系列
背包问题给定容量和元素,然后让选元素416. 分割等和子集给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。注意:每个数组中的元素不会超过 100数组的大小不会超过 200示例 1:输入: [1, 5, 11, 5]输出: true解释: 数组可以分割成 [1, 5, 5] 和 [11].示例 2:输入: [1, 2, 3, 5]输出: false解释: 数组不能分割成两个元素和相等的子集.题解记忆化深搜不行,优化到最后还是超原创 2021-02-12 13:21:49 · 408 阅读 · 0 评论 -
【LeetCode】动态规划问题:常见题型(下)
91. 解码方法一条包含字母 A-Z 的消息通过以下映射进行了 编码 :'A' -> 1'B' -> 2...'Z' -> 26要 解码 已编码的消息,所有数字必须基于上述映射的方法,反向映射回字母(可能有多种方法)。例如,“111” 可以将 “1” 中的每个 “1” 映射为 “A” ,从而得到 “AAA” ,或者可以将 “11” 和 “1”(分别为 “K” 和 “A” )映射为 “KA” 。注意,“06” 不能映射为 “F” ,因为 “6” 和 “06” 不同。给你一个只原创 2021-02-12 13:21:29 · 262 阅读 · 0 评论 -
【LeetCode】动态规划问题:常见题型(上)
典例70. 爬楼梯假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。示例 1:输入: 2输出: 2解释: 有两种方法可以爬到楼顶。1. 1 阶 + 1 阶2. 2 阶示例 2:输入: 3输出: 3解释: 有三种方法可以爬到楼顶。1. 1 阶 + 1 阶 + 1 阶2. 1 阶 + 2 阶3. 2 阶 + 1 阶题解class Solution {原创 2021-02-12 13:21:12 · 176 阅读 · 0 评论 -
【LeetCode】回溯问题:N 皇后问题
N 皇后51. N 皇后难度困难745收藏分享切换为英文接收动态反馈n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。示例 1:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E8t6Kwhl-1612967566653)(开发.assets/que原创 2021-02-12 13:21:02 · 209 阅读 · 0 评论 -
【LeetCode】回溯问题:二维平面类型
二维平面79. 单词搜索难度中等774收藏分享切换为英文接收动态反馈给定一个二维网格和一个单词,找出该单词是否存在于网格中。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。示例:board =[ ['A','B','C','E'], ['S','F','C','S'], ['A','D','E','E']]给定 word = "ABCCED", 返回 true给定 word = "原创 2021-02-11 01:09:26 · 1030 阅读 · 0 评论 -
【LeetCode】回溯问题:排列与组合
排列问题46. 全排列难度中等1120收藏分享切换为英文接收动态反馈给定一个 没有重复 数字的序列,返回其所有可能的全排列。示例:输入: [1,2,3]输出:[ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1]]题解class Solution { public List<List<Integer>> permute(int[] nums) { List<原创 2021-02-11 01:09:13 · 376 阅读 · 0 评论 -
【LeetCode】回溯问题:常见典例
17. 电话号码的字母组合难度中等1125收藏分享切换为英文接收动态反馈给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Pm4aRCbB-1612967439178)(开发.assets/17_telephone_keypad.png)]示例 1:输入:digits = "23"输出:["ad","ae原创 2021-02-11 01:08:54 · 191 阅读 · 0 评论 -
【LeetCode】二叉树问题:二分搜索树
二分搜索树235. 二叉搜索树的最近公共祖先难度简单532收藏分享切换为英文接收动态反馈给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接原创 2021-02-11 01:08:42 · 191 阅读 · 0 评论 -
【LeetCode】二叉树问题:稍复杂递归问题
递归112. 路径总和难度简单508收藏分享切换为英文接收动态反馈给你二叉树的根节点 root 和一个表示目标和的整数 targetSum ,判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。叶子节点 是指没有子节点的节点。示例 1:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4UBx8RA6-1612967328894)(开发.assets/pathsum1.jpg)]输入:root = [5,4,8,1原创 2021-02-11 01:08:27 · 225 阅读 · 0 评论 -
【LeetCode】二叉树问题:典型操作
基操剑指 Offer 55 - I. 二叉树的深度难度简单86收藏分享切换为英文接收动态反馈输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。例如:给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回它的最大深度 3 。题解非递归用广搜class Solution { public int maxDepth(原创 2021-02-11 01:08:15 · 505 阅读 · 0 评论 -
【LeetCode】栈、队列问题:优先队列
优先队列底层实现全部都是堆jdk 提供了 Queue<String> q = new PriorityQueue<>();(注意:是小堆)347. 前 K 个高频元素难度中等629收藏分享切换为英文接收动态反馈给定一个非空的整数数组,返回其中出现频率前 *k* 高的元素。示例 1:输入: nums = [1,1,1,2,2,3], k = 2输出: [1,2]示例 2:输入: nums = [1], k = 1输出: [1]题解class Solut原创 2021-02-11 01:07:59 · 211 阅读 · 0 评论 -
【LeetCode】栈、队列问题:队列与 BFS
队列只要是树的层序遍历,遍历方法永远都是用 queue,不同题型变得只是添加元素方式(即 addFirst 还是 addLast)102. 二叉树的层序遍历难度中等765收藏分享切换为英文接收动态反馈给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。示例:二叉树:[3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回其层序遍历结果:[ [3], [9,20],原创 2021-02-11 01:07:39 · 203 阅读 · 0 评论 -
【LeetCode】栈、队列问题:用栈代替递归
模拟递归144. 二叉树的前序遍历难度中等508收藏分享切换为英文接收动态反馈给你二叉树的根节点 root ,返回它节点值的 前序 遍历。示例 1:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1n6OznQ9-1612967018121)(开发.assets/inorder_1.jpg)]输入:root = [1,null,2,3]输出:[1,2,3]示例 2:输入:root = []输出:[]示例 3:输入:root = [1]输出:[1]原创 2021-02-11 01:07:15 · 790 阅读 · 0 评论 -
【LeetCode】栈、队列问题:栈常见题型
栈20. 有效的括号难度简单2135收藏分享切换为英文接收动态反馈给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。示例 1:输入:s = "()"输出:true示例 2:输入:s = "()[]{}"输出:true题解class Solution { public boolean isValid(String s) {原创 2021-02-11 01:06:14 · 173 阅读 · 0 评论 -
【LeetCode】查找表问题:特殊键值选择
灵活选择键值454. 四数相加 II难度中等329收藏分享切换为英文接收动态反馈给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] + B[j] + C[k] + D[l] = 0。为了使问题简单化,所有的 A, B, C, D 具有相同的长度 N,且 0 ≤ N ≤ 500 。所有整数的范围在 -228 到 228 - 1 之间,最终结果不会超过 231 - 1 。例如:输入:A = [ 1, 2]B = [-2,-1]原创 2021-02-10 22:51:29 · 158 阅读 · 0 评论 -
【LeetCode】查找表问题:几数和系列问题
查找典例几数之和通常先排序,然后外层有 n - 2 个循环,对剩余两个元素用对撞指针排序的目的是为了方便确定这个元素是否被 i j 使用过,因为如果每种情况唯一的话,此时就会满足 num[i] <= nums[j] <= nums[k] ,就可以轻易判断对 k 的选择是否会导致重复(因为 k 是 O(1) 查找得到,而非遍历得到)对于有序数组,对撞指针可以轻松确定出和为某值的位置,而且避免了从查找表获得元素时,还需要判断元素大小与等于情况下的个数总结:就两种方法,最内两层对撞指针原创 2021-02-10 22:51:01 · 183 阅读 · 0 评论 -
【LeetCode】查找表问题:Map 常见典例
Map350. 两个数组的交集 II难度简单443收藏分享切换为英文接收动态反馈给定两个数组,编写一个函数来计算它们的交集。示例 1:输入:nums1 = [1,2,2,1], nums2 = [2,2]输出:[2,2]示例 2:输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]输出:[4,9]题解跟数据库原理中交运算的计算方法很类似对于无序:hash 表对于有序:多路归并class Solution { public int[原创 2021-02-10 22:50:07 · 250 阅读 · 0 评论 -
【LeetCode】查找表问题:Set 与滑动窗口
查找表指某个集合需要进行查找如果集合元素,那么 Set如果集合元素还有其对应的值,那么用 mapSet对于某个集合要经常用来查找或者去重,那么使用 Set349. 两个数组的交集难度简单321收藏分享切换为英文接收动态反馈给定两个数组,编写一个函数来计算它们的交集。示例 1:输入:nums1 = [1,2,2,1], nums2 = [2,2]输出:[2]示例 2:输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]输出:[9,4]题原创 2021-02-10 22:49:20 · 196 阅读 · 0 评论 -
【LeetCode】链表问题:双指针或回溯
双指针或回溯对于链表中要拿到后几个元素的问题,一定是双指针对于链表前几个元素要使用后面的元素,那么可以递归回溯19. 删除链表的倒数第 N 个结点难度中等1199收藏分享切换为英文接收动态反馈给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。**进阶:**你能尝试使用一趟扫描实现吗?示例 1:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sxJBGSHn-1612966719905)(开发.assets/remove_ex1.jpg)]输原创 2021-02-10 22:47:03 · 268 阅读 · 0 评论 -
【LeetCode】链表问题:虚拟头节点
虚拟头节点对于有删除问题,一定要设置虚拟头节点203. 移除链表元素难度简单521收藏分享切换为英文接收动态反馈删除链表中等于给定值 *val* 的所有节点。示例:输入: 1->2->6->3->4->5->6, val = 6输出: 1->2->3->4->5题解class Solution { public ListNode removeElements(ListNode head, int val) {原创 2021-02-10 22:45:42 · 692 阅读 · 0 评论 -
【LeetCode】链表问题:典型操作
反转链表时间复杂度 O(n) ,定义三个指针ListNode pre = null , cur = head , after = null;while(...){ after = cur.next; cur.next = pre; pre = cur; cur = after; ...}206. 反转链表难度简单1480收藏分享切换为英文接收动态反馈反转一个单链表。示例:输入: 1->2->3->4->5->原创 2021-02-10 22:44:37 · 166 阅读 · 0 评论 -
【LeetCode】数组问题:滑动窗口
滑动窗口对于数组中要选一个连续的序列,那势必就是滑动窗口;动态规划适用于选择非连续的序列和快慢指针的区别是,快指针每次循环必定加一,而滑动窗口是 r 或者 l 指针其中一个加一策略对于求最小窗口到满足条件时,r(前面的指针)不再 ++;之后 l(后面的指针 )++,把窗口变得又不满足条件对于最大窗口一直 r++,直到不满足条件再让 l++对于窗口的最值是每次循环时用 max|min(res ,r - l (+ 1))计算。结题结构int r = -1 ,原创 2021-02-10 22:43:11 · 275 阅读 · 0 评论 -
【LeetCode】数组问题:对撞指针
对撞指针核心思想维护两个索引一个指针开始时为 l = 0 ,并且执行的操作为 l ++一个指针开始时为 r = arr.length - 1,并且执行的操作为 r --;终止条件是 while( l < r )跳出循环的结果会是 l = r167、两数之和 II - 输入有序数组给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。说明:返回的原创 2021-02-10 22:42:37 · 235 阅读 · 0 评论 -
【LeetCode】数组问题:快慢指针
数组典例目的都是为了一次遍历快慢指针总体思路:维护两个索引,并且同向遍历关键问题:使用快指针 i 从前往后遍历数组时,考虑 i 对应的元素在什么时候会有操作比如需要在数组中移动的问题,那么 i 势必是在找到要移动的元素的时候停止,所以就要找到哪些 i 对应的元素要被移动(例如 nums[i] != target)但对于移动问题,对于另一个被移动到的目标位置索引(慢指针) index,此时一般 i 有操作的条件是: nums[i] != nums[index]283、移动零给定一个数原创 2021-02-10 22:41:44 · 350 阅读 · 0 评论