leetcode
力扣算法笔记、题解
mp-ui
喜欢打代码的菜鸭
展开
-
1713. 得到子序列的最少操作次数(最长上升子序列问题)
1713. 得到子序列的最少操作次数难度困难103收藏分享切换为英文接收动态反馈给你一个数组 target ,包含若干 互不相同 的整数,以及另一个整数数组 arr ,arr 可能 包含重复元素。每一次操作中,你可以在 arr 的任意位置插入任一整数。比方说,如果 arr = [1,4,1,2] ,那么你可以在中间添加 3 得到 [1,4,**3**,1,2] 。你可以在数组最开始或最后面添加整数。请你返回 最少 操作次数,使得 target 成为 arr 的一个子序列。一个数组的 子序列 指的是原创 2021-07-26 22:05:53 · 329 阅读 · 1 评论 -
264. 丑数 II(优先队列、三指针)
264. 丑数 II难度中等700收藏分享切换为英文接收动态反馈给你一个整数 n ,请你找出并返回第 n 个 丑数 。丑数 就是只包含质因数 2、3 和/或 5 的正整数。示例 1:输入:n = 10输出:12解释:[1, 2, 3, 4, 5, 6, 8, 9, 10, 12] 是由前 10 个丑数组成的序列。示例 2:输入:n = 1输出:1解释:1 通常被视为丑数。提示:1 <= n <= 1690法一:优先队列最直观的方法,先创建一个优先队列,因为第原创 2021-07-24 21:35:09 · 144 阅读 · 0 评论 -
241. 为运算表达式设计优先级(分治、区间DP)
241. 为运算表达式设计优先级难度中等399收藏分享切换为英文接收动态反馈给定一个含有数字和运算符的字符串,为表达式添加括号,改变其运算优先级以求出不同的结果。你需要给出所有可能的组合的结果。有效的运算符号包含 +, - 以及 * 。示例 1:输入: "2-1-1"输出: [0, 2]解释: ((2-1)-1) = 0 (2-(1-1)) = 2示例 2:输入: "2*3-4*5"输出: [-34, -14, -10, -10, 10]解释: (2*(3-(4*5))) = -原创 2021-07-24 16:45:18 · 127 阅读 · 0 评论 -
1482. 制作 m 束花所需的最少天数(二分查找)
1482. 制作 m 束花所需的最少天数题目描述给你一个整数数组 bloomDay,以及两个整数 m 和 k 。现需要制作 m 束花。制作花束时,需要使用花园中 相邻的 k 朵花 。花园中有 n 朵花,第 i 朵花会在 bloomDay[i] 时盛开,恰好 可以用于 一束 花中。请你返回从花园中摘 m 束花需要等待的最少的天数。如果不能摘到 m 束花则返回 -1 。示例 1:输入:bloomDay = [1,10,3,10,2], m = 3, k = 1输出:3解释:让我们一起观察这三天原创 2021-07-21 00:02:55 · 150 阅读 · 2 评论 -
1074. 元素和为目标值的子矩阵数量(二维前缀和)
1074. 元素和为目标值的子矩阵数量题目描述给出矩阵 matrix 和目标值 target,返回元素总和等于目标值的非空子矩阵的数量。子矩阵 x1, y1, x2, y2 是满足 x1 <= x <= x2 且 y1 <= y <= y2 的所有单元 matrix[x][y] 的集合。如果 (x1, y1, x2, y2) 和 (x1', y1', x2', y2') 两个子矩阵中部分坐标不同(如:x1 != x1'),那么这两个子矩阵也不同。示例 1:输入:matr原创 2021-07-21 00:01:23 · 127 阅读 · 0 评论 -
1011. 在 D 天内送达包裹的能力(二分查找)
1011. 在 D 天内送达包裹的能力题目描述1011. 在 D 天内送达包裹的能力传送带上的包裹必须在 D 天内从一个港口运送到另一个港口。传送带上的第 i 个包裹的重量为 weights[i]。每一天,我们都会按给出重量的顺序往传送带上装载包裹。我们装载的重量不会超过船的最大运载重量。返回能在 D 天内将传送带上的所有包裹送达的船的最低运载能力。 示例 1:输入:weights = [1,2,3,4,5,6,7,8,9,10], D = 5输出:15解释:船舶最低载重 1原创 2021-07-20 23:55:07 · 150 阅读 · 1 评论 -
879. 盈利计划(多维背包问题)
879. 盈利计划题目描述难度困难131集团里有 n 名员工,他们可以完成各种各样的工作创造利润。第 i 种工作会产生 profit[i] 的利润,它要求 group[i] 名成员共同参与。如果成员参与了其中一项工作,就不能参与另一项工作。工作的任何至少产生 minProfit 利润的子集称为 盈利计划 。并且工作的成员总数最多为 n 。有多少种计划可以选择?因为答案很大,所以 返回结果模 10^9 + 7 的值。示例 1:输入:n = 5, minProfit = 3, group = [原创 2021-07-20 23:54:20 · 133 阅读 · 0 评论 -
740. 删除并获得点数(dp)
740. 删除并获得点数题目描述740. 删除并获得点数给你一个整数数组 nums ,你可以对它进行一些操作。每次操作中,选择任意一个 nums[i] ,删除它并获得 nums[i] 的点数。之后,你必须删除每个等于 nums[i] - 1 或 nums[i] + 1 的元素。开始你拥有 0 个点数。返回你能通过这些操作获得的最大点数。 示例 1:输入:nums = [3,4,2]输出:6解释:删除 4 获得 4 个点数,因此 3 也被删除。之后,删除 2 获得 2 个点数原创 2021-07-20 23:52:57 · 114 阅读 · 0 评论 -
664. 奇怪的打印机(区间DP)
664. 奇怪的打印机难度困难163收藏分享切换为英文接收动态反馈有台奇怪的打印机有以下两个特殊要求:打印机每次只能打印由 同一个字符 组成的序列。每次可以在任意起始和结束位置打印新字符,并且会覆盖掉原来已有的字符。给你一个字符串 s ,你的任务是计算这个打印机打印它需要的最少打印次数。示例 1:输入:s = "aaabbb"输出:2解释:首先打印 "aaa" 然后打印 "bbb"。示例 2:输入:s = "aba"输出:2解释:首先打印 "aaa" 然后在第二个位置打印 "原创 2021-07-20 23:51:50 · 154 阅读 · 0 评论 -
525. 连续数组(前缀和+哈希)
525. 连续数组题目描述难度中等356给定一个二进制数组 nums , 找到含有相同数量的 0 和 1 的最长连续子数组,并返回该子数组的长度。示例 1:输入: nums = [0,1]输出: 2说明: [0, 1] 是具有相同数量0和1的最长连续子数组。示例 2:输入: nums = [0,1,0]输出: 2说明: [0, 1] (或 [1, 0]) 是具有相同数量0和1的最长连续子数组。提示:1 <= nums.length <= 105nums[i] 不原创 2021-07-20 23:50:37 · 120 阅读 · 1 评论 -
377. 组合总和 Ⅳ(背包、dp)
377. 组合总和 Ⅳ题目描述给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。题目数据保证答案符合 32 位整数范围。 示例 1:输入:nums = [1,2,3], target = 4输出:7解释:所有可能的组合为:(1, 1, 1, 1)(1, 1, 2)(1, 2, 1)(1, 3)(2, 1, 1)(2, 2)(3, 1)请注意,顺序不同的序列被视作不同的组原创 2021-07-20 23:48:43 · 104 阅读 · 1 评论 -
368. 最大整除子集(序列dp)
368. 最大整除子集题目描述368. 最大整除子集给你一个由 无重复 正整数组成的集合 nums ,请你找出并返回其中最大的整除子集 answer ,子集中每一元素对 (answer[i], answer[j]) 都应当满足:answer[i] % answer[j] == 0 ,或answer[j] % answer[i] == 0如果存在多个有效解子集,返回其中任何一个均可。 示例 1:输入:nums = [1,2,3]输出:[1,2]解释:[1,3] 也会被视为正确答案。原创 2021-07-20 23:47:02 · 201 阅读 · 1 评论 -
363. 矩形区域不超过 K 的最大数值和(状态压缩dp)
363. 矩形区域不超过 K 的最大数值和题目描述363. 矩形区域不超过 K 的最大数值和给你一个 m x n 的矩阵 matrix 和一个整数 k ,找出并返回矩阵内部矩形区域的不超过 k 的最大数值和。题目数据保证总会存在一个数值和不超过 k 的矩形区域。 示例 1:输入:matrix = [[1,0,1],[0,-2,3]], k = 2输出:2解释:蓝色边框圈出来的矩形区域 [[0, 1], [-2, 3]] 的数值和是 2,且 2 是不超过 k 的最大数字(k = 2原创 2021-07-20 23:44:58 · 158 阅读 · 1 评论 -
LeetCode 87. 扰乱字符串
题目描述题目链接:https://leetcode-cn.com/problems/scramble-string/87. 扰乱字符串使用下面描述的算法可以扰乱字符串 s 得到字符串 t :如果字符串的长度为 1 ,算法停止如果字符串的长度 > 1 ,执行下述步骤:在一个随机下标处将字符串分割成两个非空的子字符串。即,如果已知字符串 s ,则可以将其分成两个子字符串 x 和 y ,且满足 s = x + y 。随机 决定是要「交换两个子字符串」还是要「保持这两个子字符串的顺序不变」。即,原创 2021-04-16 19:31:37 · 131 阅读 · 0 评论 -
LeetCode No33. 搜索旋转排序数组
题目描述二分法思路:根据旋转排序数组的特点,比如[4,5,6,7,0,1,2],可以发现一个规律:在分割点之前、分割点之后的两部分数组,左边的所有元素都比右边的大。所以,我们就根据这个进行二分搜索,找到那个分割点!二分搜索查找分割点的思路:可以以nums的最后一个数作为参考,比如[4,5,6,7,0,1,2],最后的一个数是2,分割点左边[4,5,6,7]一定都比2大,分割点右边[0,1,2]一定都小于等于2,所以用二分查找在nums中找出第一个小于等于2的位置即可。拿到分割点之后,再判断targ原创 2021-04-08 17:34:02 · 147 阅读 · 2 评论 -
LeetCode No115. 不同的子序列(动态规划)
题目描述题目链接:https://leetcode-cn.com/problems/distinct-subsequences/动态规划解法思路:定义状态 dp[i][j] ,表示s[0… i-1] 中的子序列出现t[0…j-1]的次数。class Solution { char[] cs; char[] ct; public int numDistinct(String s, String t) { this.cs = s.toCharArray();原创 2021-03-17 22:35:05 · 103 阅读 · 0 评论 -
LeetCode No132. 分割回文串 II
题目描述解法一:记忆化递归class Solution { private char[] cs; private int[] temp; //记忆化数组 public int minCut(String s) { this.cs = s.toCharArray(); this.temp = new int[cs.length]; return dfs(0) - 1; } /** * 检查字符串s[fr原创 2021-03-09 14:48:04 · 121 阅读 · 0 评论 -
LeetCode No316. 去除重复字母
题目描述题解:单调栈思路:首先需要明白的一个事实就是:如果要求字典序最小,那么最好就是abcdefg这样的字符串,越小的字母我们希望越要往前排。入栈:如果当前字符比栈顶字符大或者栈空,并且栈内没有当前字符,则入栈出栈:如果栈顶字符比当前字符大,并且当前位置后面还有栈顶字符(避免因为出栈之后后面就没有该字符入栈了),则出栈class Solution { public String removeDuplicateLetters(String s) { char[] cs原创 2021-03-06 20:32:50 · 127 阅读 · 0 评论 -
LeetCode No31. 下一个排列
题目描述解答找规律就行了:class Solution { public void nextPermutation(int[] nums) { int n = nums.length; //数组的长度 int i = n - 1; //找到递减的第一个位置 while (i > 0 && nums[i - 1] >= nums[i]) { --i; }原创 2021-03-06 20:01:03 · 118 阅读 · 0 评论 -
LeetCode No503.下一个更大元素 II
题目描述解法一:暴力时间复杂度:O(n^2),暴力竟然也能过!!class Solution { public int[] nextGreaterElements(int[] nums) { //延长nums数组是原来的2倍 int[] nums1 = new int[nums.length * 2]; //复制 System.arraycopy(nums, 0, nums1, 0, nums.length);原创 2021-03-06 19:03:52 · 112 阅读 · 0 评论 -
LeetCode No496.下一个更大元素 I
题目描述解法:单调栈class Solution { public int[] nextGreaterElement(int[] nums1, int[] nums2) { int[] res = new int[nums1.length]; //需要返回的结果数组 Arrays.fill(res,-1); //默认填充-1 HashMap<Integer,Integer> map = new HashMap<>()原创 2021-03-06 12:52:11 · 110 阅读 · 0 评论 -
LeetCode No402.移掉K位数字
题目描述解法:单调栈解题思路:永远保持stack是单调递增的状态,只要还有删除的机会class Solution { public String removeKdigits(String num, int k) { LinkedList<Character> stack = new LinkedList<>(); //栈 int remain = k; //剩余的丢弃次数 char[] cs = num.toC原创 2021-03-05 00:48:10 · 106 阅读 · 1 评论 -
LeetCode No300.最长递增子序列
题目描述解法一:动态规划时间复杂度:O(n ^ 2)空间复杂度:O(n)状态定义:dp[i]表示nums[0…i]的最长的子序列,且必须nums[i]被选中且在最后状态转移:依次遍历dp[0…i-1],如果nums[j] < nums[i],那么dp[i] = dp[j] + 1,并且dp[i]取最大的那一个。class Solution {public: int lengthOfLIS(vector<int>& nums) { int原创 2021-03-04 19:00:09 · 144 阅读 · 1 评论 -
LeetCode No204. 计数质数(厄拉多塞筛法)
LeetCode No204. 计数质数(厄拉多塞筛法)原创 2020-12-03 22:21:16 · 192 阅读 · 2 评论 -
LeetCode No354.俄罗斯套娃问题(最长上升子序列的升级版)
思路:首先对envelops按照envelops[][0]排序,然后看envelops[][1]即可,跟最长上升子序列的题一样class Solution { public int maxEnvelopes(int[][] envelopes) { if(envelopes.length <= 1){ return envelopes.length; } Arrays.sort(envelopes, Comparato.原创 2020-12-01 10:01:27 · 82 阅读 · 0 评论