LeetCode
文章平均质量分 53
分享自己的算法刷题历程
雨夜※繁华
用最强大的行动力诠释一个完美的自己,期望未来成为自己眼中的大神。改变命运!
展开
-
LeetCode1312、让字符串成为回文串的最少操作次数(区间动态规划方法)
题目描述https://leetcode-cn.com/problems/minimum-insertion-steps-to-make-a-string-palindrome/解法class Solution { public int minInsertions(String s) { if(s==null || s.length()<=1) return 0; //将字符串分成两部分 int n = s.length();原创 2021-04-02 12:16:48 · 2926 阅读 · 0 评论 -
LeetCode打家劫舍系列(经典动态规划系列问题)
文章目录题目列表逐一攻破198、打家劫舍(中等)213、打家劫舍II(中等)337、打家劫舍III(中等)题目列表逐一攻破198、打家劫舍(中等)看到题目,我们以常规动态规划的思路去思考:状态:题目有哪些变量?第i间房子的金钱数,每次能够偷盗的房间不允许相邻。目前小偷的位置于是我们描述出:dp[i]表示偷盗到第i家房子时的最大金额数思考递推过程,目前的位置在第i家房子,不允许相邻偷盗,则在我们之前的房子中选择能够偷盗的最大金钱max的房子,dp[i] = max+nums[i-1];i-原创 2021-04-01 12:14:38 · 277 阅读 · 0 评论 -
LeetCode买卖股票系列总结(动态规划或者递归、进阶状态机)
题目合集逐一攻破LeetCode121. 买卖股票的最佳时机(简单)使用暴力枚举的方法超时,但是能通过大部分案例,复杂度为O(n2)。优化:看一下有哪些东西重叠了:要想获得最大收益,那起码得买入价格>卖出的价格。那么如果我们知道了卖出的价格,只要选择在这天(可以今天买入今天卖出)前比卖出的价格小的就行了,而在当前卖出的价格中最大收益必然是来自我们买入的最小股票价格。也就是说我们维护了一个表示在第i天卖出的股票之前买入股票的最小价格curMin:可以得到如下代码:class Solu原创 2021-03-27 22:44:12 · 675 阅读 · 0 评论 -
LeetCode61、旋转链表
题目描述https://leetcode-cn.com/problems/rotate-list/解法首先一看到这个题,我们就可以想到的想法:k的次数大过链表的长度k的次数小于链表的长度对应的做法。从本质上看,旋转一次就是:找到尾部结点和其上一个结点去除尾部结点,然后将该尾部结点头插法那么旋转K次就是进行旋转一次的K次调用:class Solution { public ListNode rotateRight(ListNode head, int k) {原创 2021-03-27 10:18:04 · 139 阅读 · 0 评论 -
LeetCode650、只有两个键的键盘(数学、因子、dp)
题目描述https://leetcode-cn.com/problems/2-keys-keyboard/解法单纯知道是动态规划,很难去思考它的递推过程。于是去看题解:我们就知道它是如何思考的,不同于四键键盘问题,四键键盘问题它的目标是求得最大的操作数,本质也是遍历所有可能情况的最大值,但是却很直观。这道题则比较绕,如果我们不知道可以分组思考的话,比较难做。class Solution { public int minSteps(int n) { int []dp =原创 2021-03-26 19:23:59 · 174 阅读 · 0 评论 -
LintCode867、四键键盘问题(dp数组的定义)
题目描述这道题在leetcode要会员,所以我去了lintcode做了。https://www.lintcode.com/problem/867/解法第一次解法第一次觉得挺好做的,于是写出来如下代码:public class Solution { /** * @param N: an integer * @return: return an integer */ public int maxA(int N) { // write y原创 2021-03-26 11:18:08 · 341 阅读 · 1 评论 -
LeetCode312、戳气球(难)
题目描述https://leetcode-cn.com/problems/burst-balloons/解法(动规)看了大概7、8分钟,没有思路。自己暴力的想法是n的阶乘级别,代码也难写。直接看题解,很巧妙,很惊叹。参考讲解:经典动态规划:戳气球直接上代码:class Solution { public int maxCoins(int[] nums) { if(nums==null || nums.length==0) return 0; if(num原创 2021-03-21 12:11:07 · 120 阅读 · 0 评论 -
LeetCode887、鸡蛋掉落(难)
题目描述https://leetcode-cn.com/problems/super-egg-drop/解法自己想不出来,题目看了也不是很理解。最后去看了题解分析。知道是要求无论f是在0<=f<=N的哪个值,给定的操作数都能把它找出来,则求出这个操作数的最小值。1、动态规划要知道的:如果只有一个鸡蛋,则只能一层一层,从底部往上面试,才能知道f的操作数,即if(k==1) return n;如果楼层为0,则不需要鸡蛋,我们就知道f = 0,操作数也是0,即if(n==0) ret原创 2021-03-20 11:18:09 · 159 阅读 · 0 评论 -
LeetCode10、正则表达式匹配(注意防止下标越位的问题)
做不出来,下标问题:class Solution { public boolean isMatch(String s, String p) { //dp[i][j]表示从s[0...i]匹配p[0...j]的结果 //这里要加1?则表示s 的前 i 个字符与 p 中的前 j 个字符是否能够匹配 boolean [][]dp = new boolean[s.length()+1][p.length()+1]; dp[0][0] = tr原创 2021-03-16 17:20:37 · 128 阅读 · 0 评论 -
LeetCode22、删除单链表的倒数第n个节点
题目描述https://leetcode-cn.com/problems/lian-biao-zhong-dao-shu-di-kge-jie-dian-lcof/解法1、利用递归:/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */class So原创 2021-03-14 21:48:56 · 113 阅读 · 0 评论 -
LeetCode141、判断链表是否有环(注意不一定在头节点回环)
题目描述https://leetcode-cn.com/problems/linked-list-cycle/双指针解法/** * Definition for singly-linked list. * class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } */publi原创 2021-03-13 22:16:00 · 98 阅读 · 0 评论 -
LeetCode42、接雨水
题目描述https://leetcode-cn.com/problems/trapping-rain-water/解法解法一:超时无法AC(纵向遍历)从底部向上,计算每个层的积水,层数为最大的数,每次要维护一个start和endclass Solution { public int trap(int[] height) { //一层一层的计算 //维护一个层数,和计算的雨水 if(height==null ||height.length&l原创 2021-03-12 20:33:23 · 111 阅读 · 0 评论 -
LeetCode面试题17.14、最小K个数
题目描述https://leetcode-cn.com/problems/smallest-k-lcci/解法使用快排,然后根据输入的K,我们决定接下来递归哪一边:class Solution { public int[] smallestK(int[] arr, int k) { if(arr.length==0) return new int[0]; int []res = new int[k]; quickSort(arr,0,arr.原创 2021-03-11 20:41:51 · 140 阅读 · 0 评论 -
LeetCode45、跳跃游戏II(动态规划无法通过)
题目描述解法首先想到的是动态规划来做:维护一个dp[i]数组表示跳到下标为i时所需要的最少步数那么我们递推dp[i+1]时,只需要在前面的i个dp[i]里面寻找能够跳到坐标i+1的最小步数之和返回dp[nums.length]代码:class Solution { public int jump(int[] nums) { //状态:当前的位置i,要到达的位置j,使用的跳跃次数 if(nums==null || nums.length==0||num原创 2021-03-09 17:00:39 · 177 阅读 · 0 评论 -
LeetCode55、跳跃游戏(dp或者贪心)
题目描述https://leetcode-cn.com/problems/jump-game/解法思考使用dp来做的话,我们的dp数组定义为什么?变量是什么?每步跳跃,抵达的位置不同,每个位置能跳的步数也不同,我们如何定义dp?很明显我们用dp来表达每个位置能跳的步数,所以我们只能选择抵达的位置,于是得出dp[i]表示从0到i下标是否可以抵达思考递推,当前的dp[i]取决于之前的从之前的位置出发是否能抵达,我们需要维护一个变量来表示当前能抵达的最大下标,如果当前的下标在最大能抵达下标范围内(原创 2021-03-09 15:11:52 · 219 阅读 · 0 评论 -
LeetCode452、用最少数量的箭引爆气球(贪心选择区间调度)
题目描述https://leetcode-cn.com/problems/minimum-number-of-arrows-to-burst-balloons/解法同上一道题的本质。class Solution { public int findMinArrowShots(int[][] points) { //贪心选择,尽可能地一次射爆交叠最多的气球的坐标范围 //剩余不交叠的区间,一支射爆一个 //从可视化图上看,我们只需要求出最大不交原创 2021-03-09 11:56:16 · 114 阅读 · 0 评论 -
LeetCode435、无重叠区间(贪心选择区间调度)
题目描述https://leetcode-cn.com/problems/non-overlapping-intervals/解法贪心选择适合解决活动交叉的问题,使用的范围很小。这个问题,我们的贪心选择是:每次从剩余的活动里面选择不交叉的结束时间最早的活动。交叉的都剔除。class Solution { public int eraseOverlapIntervals(int[][] intervals) { //使用贪心算法里面的区间调度问题,每次选择当前活动集合里面结束原创 2021-03-09 11:41:49 · 117 阅读 · 0 评论 -
LeetCode518、零钱兑换II(完全背包问题)
题目描述https://leetcode-cn.com/problems/coin-change-2/解法完全背包问题,框架:确定状态,就是问题中的变量有哪些——1、不同种类的硬币;2、总金额数;3、所用硬币数目;然后根据题目,我们只需要使用前两个量就能描述出当前的问题,说明dp数组为二维,且两个维度分别对应1、2变量。dp数组下定义:dp[i][j]表示前i种硬币能凑出金额为j的方法数,严格相信这个定义确定递推过程:如果第i个硬币装得下,我可以选择不装,则dp[i][j] = dp[i-1原创 2021-03-09 10:50:30 · 277 阅读 · 0 评论 -
LeetCode416、分割等和子集(转化为0-1背包问题)
题目描述https://leetcode-cn.com/problems/partition-equal-subset-sum/解法(背包类型dp问题)官方题解开篇就是:还是老老实实做题吧:这是背包型dp问题,思考当前的问题里面,要描述的变量有哪些,比如物品数量,背包重量,是否能装满,也就是我们第一步要做的:要明确两点,「状态」和「选择」,它不同于子序列和字符串的问题了,而是描述一个子问题现象,对应的下标如dp[i][j]也不再是从s[i…j]的什么什么,而是i个物品里面选择装什么,能把容原创 2021-03-08 22:28:04 · 180 阅读 · 0 评论 -
LeetCode5、最长回文字串
题目描述https://leetcode-cn.com/problems/longest-palindromic-substring/解法(存在的问题——dp数组遍历的顺序还不太明确)第一次通过代码:class Solution { public String longestPalindrome(String s) { //字符串,使用双指针,则使用二维数组 if(s==null) return null; if(s.length()==0)原创 2021-03-07 22:37:51 · 118 阅读 · 2 评论 -
LeetCode712、两个字符串的最小ASCII删除和
题目描述https://leetcode-cn.com/problems/minimum-ascii-delete-sum-for-two-strings/解法自顶向下的动态规划看了这道题,其实很像寻找两个字符串的最长公共子序,因为这里要找最小ASCII码删除和,就像寻找最长公共子序一样,因为多出来的字符,它们肯定要删除的,而如果不是最长公共子序,必然删除得到的AscII码值之和必然更大。所以题目可以使用两个字符串的最长公共子序的类似解法来做:class Solution { int[原创 2021-03-07 15:53:45 · 134 阅读 · 0 评论 -
LeetCode583、两个字符串的删除操作
题目描述https://leetcode-cn.com/problems/delete-operation-for-two-strings/解法递归(自顶向下动态规划)class Solution {// 备忘录,消除重叠子问题int[][] memo; public int minDistance(String word1, String word2) { int m = word1.length(), n = word2.length(); // 备原创 2021-03-07 12:04:43 · 129 阅读 · 0 评论 -
LeetCode1143、最长公共子序列
题目描述解法(1)自顶向下递归(动态规划)class Solution { // 备忘录,消除重叠子问题int[][] memo;/* 主函数 */int longestCommonSubsequence(String s1, String s2) { int m = s1.length(), n = s2.length(); // 备忘录值为 -1 代表未曾计算 memo = new int[m][n]; for (int[] row : memo)原创 2021-03-07 11:12:52 · 94 阅读 · 0 评论 -
LeetCode53、最大子序和
题目描述(简单动态递归)https://leetcode-cn.com/problems/maximum-subarray/解法以思考动态递归的通用过程去思考问题,一般求最大的子序和,或者最大递增序列什么的,都是定义dp[i]表示以i结尾的最大…去思考。然后思考递推方程,用实例,然后自己去试着从0开始一个一个推,得到方程第三步,思考边界情况最后思考结果返回。第一次代码:class Solution { public int maxSubArray(int[] nums) {原创 2021-03-06 19:05:21 · 115 阅读 · 0 评论 -
LeetCode354、俄罗斯套娃信封问题
问题描述https://leetcode-cn.com/problems/russian-doll-envelopes/解法(动规问题一般处理)class Solution { public int maxEnvelopes(int[][] envelopes) { //这道题很明显我们排序不会影响最终的结果。 //如何我们能够按照信封的大小从小到大排序,我们就比较好找出最多嵌套的信封 Arrays.sort(envelopes,new原创 2021-03-06 11:34:12 · 110 阅读 · 0 评论 -
LeetCode300、最长递增子序列
题目描述https://leetcode-cn.com/problems/longest-increasing-subsequence/submissions/解法(动态规划思考过程)思考: //定义dp数组的含义(暂时无法直接确定维数) //dp[i]表示以num[i]为结尾元素的最长递增子序列 /* *思考递推的过程是什么?知道了dp[0],dp[1],dp[...],dp[i-1],如何递推dp原创 2021-03-06 11:28:53 · 77 阅读 · 0 评论 -
LeetCode72、编辑距离(动态规划系列)
题目描述https://leetcode-cn.com/problems/edit-distance/解法1、递归法(超时、备忘录通过)对于一些动态规划问题,我们思考时,我们不要去思考它是如何做使得现象发生的,我们只需要得到最终的结果即可。我们只关注于最值如何得到。我们还要思考递归函数,它对应的意义是什么?(对应上参数的意义)、比如这道题里面,minDp(i,j)表示字符串S1[0,i]变到S2[0,j]需要的最少步数。class Solution { //使用递归,我们先来看原创 2021-03-05 21:52:37 · 161 阅读 · 0 评论 -
LeetCode145、二叉树的后序遍历(自底向上地思考)
题目描述解法递归——简单class Solution { List<Integer> list = new ArrayList<>(); public List<Integer> postorderTraversal(TreeNode root){ postorderTraversal(root,list); return list; } public void postorderTraversal(TreeNode root, Lis原创 2021-03-05 13:23:40 · 181 阅读 · 1 评论 -
LeetCode94、二叉树的中序遍历
题目描述https://leetcode-cn.com/problems/binary-tree-inorder-traversal/解法1、递归解法(简单) //中序递归: List<Integer> list = new ArrayList<>(); public List<Integer> inorderTraversal(TreeNode root) { inorderTraversal(root,list); re原创 2021-03-04 21:03:44 · 118 阅读 · 2 评论 -
计算完全二叉树的节点数(算法优化)
完全二叉树我们先来回顾一下什么是完全二叉树?一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树。 ————来自维基百科从定义里面,我们就知道完全二叉树其对应的结点编号和对应的满二叉树是一致的。进而我们知道它的子树必然包含一颗满二叉树子树。计算完全二叉树的节点数(算法和优化复杂度)1、使用普通的二叉树节点数计算int countNode(TreeNode r原创 2021-03-04 13:39:53 · 1582 阅读 · 1 评论 -
LeetCode236、二叉树的最近公共祖先
题目描述https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree/解法(递归问题——灵活三问)有时候,思考如何处理,应当适当的思考递归返回的结果情况,然后根据返回的情况作进一步的判断。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * T原创 2021-03-04 13:16:11 · 108 阅读 · 1 评论 -
LeetCode341、扁平化嵌套列表迭代器
1、题目描述2、解法利用多叉树遍历的方法,把所有的值取出按顺序放到一个result列表里面,然后迭代器就取该result list的迭代器实现。/** * // This is the interface that allows for creating nested lists. * // You should not implement it, or speculate about its implementation * public interface NestedInteger {原创 2021-03-03 12:54:51 · 116 阅读 · 0 评论 -
LeetCode297、二叉树的序列化与反序列化
1、题目描述2、解法这里使用后序遍历解法:我们知道仅仅知道一种遍历结果是无法还原一颗二叉树的,但是现在我们只需要序列化的时候,把空指针也序列化(如使用#表示)则我们是可以还原一个树出来的。后序遍历/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x)原创 2021-03-02 11:04:26 · 146 阅读 · 0 评论 -
二叉搜索树(关于BST新思维)
文章目录1、BST的定义回顾2、BST的增删改查3、BST的合法约束判断1、BST的定义回顾二叉查找树(英语:Binary Search Tree),也称为二叉查找树、有序二叉树(ordered binary tree)或排序二叉树(sorted binary tree),是指一棵空树或者具有下列性质的二叉树:若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值;若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值;任意节点的左、右子树也分别为二叉查找树;二叉查找原创 2021-03-01 16:02:33 · 217 阅读 · 0 评论 -
LeetCode538和1038、把二叉搜索树转换为累加树(BST思维)
1、题目描述538、把二叉搜索树转换为累加树1038、把二叉搜索树转换为累加树两道题一样。2、解法/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } *原创 2021-03-01 13:38:11 · 104 阅读 · 0 评论 -
LeetCode230、寻找第K小的元素(BST的算法思维)
1、题目描述https://leetcode-cn.com/problems/kth-smallest-element-in-a-bst/2、解法(对应的思维)/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int v原创 2021-03-01 13:26:38 · 374 阅读 · 0 评论 -
LeetCode652、寻找重复的子树
1、题目描述https://leetcode-cn.com/problems/find-duplicate-subtrees/2、解法class Solution { LinkedList<TreeNode> res = new LinkedList<TreeNode>();//存储结果 HashMap<String,Integer> memo = new HashMap<>();//记录所有子树出现的次数 public Lis原创 2021-02-28 17:11:32 · 129 阅读 · 0 评论 -
LeetCode106、从中序和后序遍历序列构造二叉树
1、题目描述https://leetcode-cn.com/problems/construct-binary-tree-from-inorder-and-postorder-traversal/2、解法有了前一道题的经验加成,我们可以很容易的写出下面的代码:class Solution { public TreeNode buildTree(int[] inorder, int[] postorder) { return build(inorder,0,inorder.l原创 2021-02-28 12:21:14 · 130 阅读 · 1 评论 -
LeetCode105、从前序与中序遍历序列构造二叉树
1、题目描述https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/2、回顾二叉树的前序/中序/后序得到的序列特点我们首先回顾三种遍历:void traverse(TreeNode root) { // 前序遍历 preorder.add(root.val); traverse(root.left); traverse(root.right)原创 2021-02-28 12:10:09 · 124 阅读 · 0 评论 -
LeetCode654、最大二叉树
1、题目描述2、解答第一次写法:class Solution { public TreeNode constructMaximumBinaryTree(int[] nums) { return build(nums,0,nums.length-1); }//start是数组起始索引,end为终止索引 public TreeNode build(int[]nums,int start,int end){ if(start>end) ret原创 2021-02-28 10:44:34 · 83 阅读 · 0 评论