LeetCode
你别教我打游戏
直面困难,重视过程,追求结果,淡忘过去。
展开
-
LeetCode 1000. 合并石头的最低成本(经典区间DP)
【代码】LeetCode 1000. 合并石头的最低成本(经典区间DP)原创 2023-01-08 19:43:28 · 373 阅读 · 1 评论 -
LeetCode 41. 缺失的第一个正数
LeetCode 41. 缺失的第一个正数原创 2022-10-18 16:47:44 · 201 阅读 · 0 评论 -
LeetCode 440. 字典序的第K小数字
字典树原创 2022-10-18 16:35:14 · 267 阅读 · 0 评论 -
LeetCode 301. 删除无效的括号
【代码】LeetCode 301. 删除无效的括号。原创 2022-09-27 11:05:55 · 144 阅读 · 0 评论 -
LeetCode 313. 超级丑数(优先队列)
class Solution {public: int nthSuperUglyNumber(int n, vector<int> &primes) { priority_queue<long long, vector<long long>, greater<long long>> buff; unordered_set<long long> primeset; buff.原创 2022-09-13 00:54:42 · 95 阅读 · 0 评论 -
LeetCode 37.解数独
添加链接描述原创 2022-08-08 16:26:39 · 70 阅读 · 0 评论 -
剑指 Offer 37. 序列化二叉树(层次遍历)
[剑指 Offer 37. 序列化二叉树](剑指 Offer 37. 序列化二叉树)/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */public class Codec { // Encodes a原创 2021-12-02 23:33:55 · 936 阅读 · 0 评论 -
LeetCode 10. 正则表达式匹配(双串dp)
10. 正则表达式匹配class Solution {public: bool f[30][40] = {0}; bool isMatch(string s, string p) { int m = s.size(), n = p.size(); s = " " + s; p = " " + p; f[0][0] = 1; auto ok = [&](int i, int j) {原创 2021-12-02 22:44:08 · 172 阅读 · 0 评论 -
剑指 Offer 21. 调整数组顺序使奇数位于偶数前面(循环不变量)
class Solution { public int[] exchange(int[] nums) { int n = nums.length; int i = -1, j = 0; for(; j < n; j++) { if(nums[j] % 2 == 1) { int t = nums[++i]; nums[i] = nums[j];原创 2021-11-24 22:28:47 · 48 阅读 · 0 评论 -
LeetCode 1713 得到子序列的最少操作次数 (最长上升子序列(二分+贪心)、最长公共子序列)
LeetCode 1713class Solution {public: int minOperations(vector<int>& target, vector<int>& arr) { int n = target.size(); unordered_map<int,int> mp; for(int i = 0; i < n; i++) { mp[target[原创 2021-07-27 00:32:01 · 111 阅读 · 0 评论 -
LeetCode 1893. 检查是否区域内所有整数都被覆盖 (差分数组 | 区间合并)
1893. 检查是否区域内所有整数都被覆盖class Solution {public: bool isCovered(vector<vector<int>>& ranges, int left, int right) { vector<int> diff(60); for(auto& p:ranges) { diff[p[0]]++; diff[p[1]+1]--原创 2021-07-23 04:00:32 · 167 阅读 · 0 评论 -
LeetCode 1838. 最高频元素的频数 (排序 + 二分 | 滑窗)
1838. 最高频元素的频数排序+二分class Solution {public: int maxFrequency(vector<int>& nums, int k) { sort(nums.begin(),nums.end()); int ans = 1; int n = nums.size(); vector<long long> s(n); s[0] = nums[0]原创 2021-07-19 18:31:14 · 81 阅读 · 0 评论 -
LeetCode 467. 环绕字符串中唯一的子字符串 (计数DP)
467. 环绕字符串中唯一的子字符串思路:记录分别以 26 的小写英文字母结尾(开头也是一样的)的最长子串的长度。即:…a (x0)…b (x1)…c (x2)。。。。。…z (x25)那么答案就是 x0+x1+x2+…+x25.这就可以做到不重不漏。或者换个说法:用布尔值f[c][len]f[c][len]f[c][len]表示以字符c开始的合法的len个字符是否在串p中出现,那么总的状态数就是 26∗len(p)26 * len(p)26∗len(p),是有限的。class原创 2021-06-12 23:18:05 · 110 阅读 · 0 评论 -
LeetCode 750. 角矩形的数量 (枚举、哈希表)
750. 角矩形的数量关键是如何枚举矩形。暴力枚举就是分别枚举矩形的两个角,时间复杂度:O(n4)O(n^4)O(n4)下面的做法,依次考虑每增加的一行对答案的贡献。具体来说,如果上面已经在 3 行在列索引为1,9出现,那么现在这一行也在列索引1,9出现,那么对答案贡献了 3 次。class Solution {public: int countCornerRectangles(vector<vector<int>>& grid) {原创 2021-06-12 23:08:27 · 164 阅读 · 0 评论 -
LeetCode 651. 4键键盘 (数学、思维)
651. 4键键盘前几个特判,后面的肯定不去单独打一个字符,肯定是paste操作划算。const int N = 55;class Solution {public: int maxA(int n) { int f[N] = {0,1,2,3,4,5,6}; for(int i = 7; i <= n; i++) { for(int j = 1; j <= i - 3; j++) { f[i]原创 2021-06-12 23:00:44 · 77 阅读 · 0 评论 -
LeetCode 376. 摆动序列 (动态规划、贪心)
376. 摆动序列方法一以f[i][0]、f[i][1]f[i][0]、f[i][1]f[i][0]、f[i][1]分别表示以第 i 位结尾的子序列分别是下降、上升状态的最长长度,每次以O(n)O(n)O(n)的开销去转移。const int N = 1010;class Solution {public: int wiggleMaxLength(vector<int>& nums) { int f[N][2] = {0}; int a原创 2021-06-12 22:58:13 · 72 阅读 · 0 评论 -
LeetCode562. 矩阵中最长的连续1线段 (简单动态规划)
562. 矩阵中最长的连续1线段简单题。f[i][j][k]f[i][j][k]f[i][j][k]多一个状态k用来枚举方向即可。class Solution {public: vector<vector<int>> vs = {{0,-1},{-1,0},{-1,-1},{-1,1}}; int longestLine(vector<vector<int>>& mat) { int m = mat.size()原创 2021-06-12 10:32:17 · 285 阅读 · 0 评论 -
LeetCode 650. 只有两个键的键盘 (动态规划、数学)
只有两个键的键盘我的憨憨做法。。。(数学的做法就不说了)思路:本质就是模拟,因为每次都是copyall一次之后,多次执行paste的,所以。class Solution {public: int MAX = 1e8; int minSteps(int n) { if(n == 1) return 0; int ans = MAX; for(int x = 1; x <= n/2; x++) { ans原创 2021-06-12 10:25:49 · 96 阅读 · 0 评论 -
LeetCode 418. 屏幕可显示句子的数量 (动态规划)
418. 屏幕可显示句子的数量纯的暴力模拟肯定是过不了的。如何优化?观察发现,如果某一行的第一个单词确定的话,那么我们不仅可以知道这一行可以放单词的数目,而且可以知道下一行的第一个单词是什么。所以,f[i]f[i]f[i]表示这一行的第一个单词为sentence[i]sentence[i]sentence[i]时的能放的单词的总数目,nxt[i]nxt[i]nxt[i]表示这一行的第一个单词为sentence[i]sentence[i]sentence[i]时的下一行的首个单词的下标。有点像链原创 2021-06-11 17:55:13 · 457 阅读 · 0 评论 -
LeetCode 361. 轰炸敌人 (预处理 + 暴力枚举)
361. 轰炸敌人纯粹暴力枚举的时间复杂度为O(m∗n∗(m+n))O(m*n*(m+n))O(m∗n∗(m+n));通过预处理出当前位置,向左右、上下方向延伸时所能轰炸的最多的敌人数,之后就可以在O(1)复杂度完成对当前位置的计算。时间复杂度:O(m∗n)O(m*n)O(m∗n)class Solution {public: int maxKilledEnemies(vector<vector<char>>& grid) { if(grid原创 2021-06-11 17:42:02 · 223 阅读 · 0 评论 -
LeetCode 576. 出界的路径数 (计数DP)
576. 出界的路径数实际上从示例已经可以看出思路来,状态定义:f[i][j][step]f[i][j][step]f[i][j][step] 表示在位置 (i,j)(i,j)(i,j) 时必须走stepstepstep步的方案数。如何转移,向四个方向转移即可。(其实这道题目使用记忆化实现可能更简洁一点。。。)const int N = 55;const int dx[] = {0,1,0,-1};const int dy[] = {1,0,-1,0};class Solution {pu原创 2021-06-11 17:33:52 · 58 阅读 · 0 评论 -
LeetCode 351. 安卓系统手势解锁 (枚举子集+全排列、回溯)
351. 安卓系统手势解锁方法一实际上就是A(9,i)A(9,i)A(9,i)的实现,先通过状态的枚举求出子集,然后使用next_permutation()求出全排列。const int N = 400000;class Solution {public: pair<int,int> toDot(int x) { return {x/3,x - x/3*3}; } bool ok(vector<int>& a) {原创 2021-06-11 17:20:54 · 203 阅读 · 0 评论 -
LeetCode 1744. 你能在你最喜欢的那天吃到你最喜欢的糖果吗?(前缀和 + 阅读理解)
1744. 你能在你最喜欢的那天吃到你最喜欢的糖果吗?其实按照糖果数比较是更好的,就不用除法而不是乘法了。class Solution {public: vector<bool> canEat(vector<int>& candiesCount, vector<vector<int>>& queries) { int n = queries.size(); vector<bool> an原创 2021-06-05 17:05:44 · 59 阅读 · 0 评论 -
LeetCode 525. 连续数组 (哈希表、前缀和)
525. 连续数组子数组的很多题目都可以这么操作,老套路题了。const int N = 100010;class Solution { int id(int x) { return x + N; }public: int findMaxLength(vector<int>& nums) { int n = nums.size(), ans = 0; int f[2*N]; memset(f,原创 2021-06-05 16:06:59 · 67 阅读 · 0 评论 -
LeetCode 1707. 与数组中元素的最大异或值 (字典树、位运算)
1707. 与数组中元素的最大异或值class Trie { struct Node { Node* childs[2] = {0}; int mmin = 1e9; }; Node* root = new Node;public: void insert(int x) { Node* p = root; p->mmin = min(x,p->mmin); for(int i =原创 2021-06-01 00:33:26 · 154 阅读 · 0 评论 -
LeetCode 1074. 元素和为目标值的子矩阵数量 (二维转成一维数组前缀和 + 哈希表 )
一维数组前缀和 + 哈希表时间复杂度:O(m2∗n)O(m^2*n)O(m2∗n)class Solution {public: int numSubmatrixSumTarget(vector<vector<int>>& matrix, int target) { int ans = 0; int m = matrix.size(), n = matrix[0].size(); for(int m1 = 0; m原创 2021-05-29 00:44:37 · 77 阅读 · 0 评论 -
1190. 反转每对括号间的子串LeetCode
1190. 反转每对括号间的子串用栈去模拟时间复杂度:O(n2)O(n^2)O(n2)import java.util.*;class Solution { public String reverseParentheses(String s) { StringBuilder stringBuilder = new StringBuilder(); Stack<Character> stack = new Stack<>();原创 2021-05-26 00:52:38 · 48 阅读 · 0 评论 -
LeetCode 1787. 使所有区间的异或结果为零 (异或性质、hard级别的DP)
1787. 使所有区间的异或结果为零难点1根据异或运算的性质可得知,最后满足条件的序列必然是这样的结构,a[0],a[1],...,a[k−1],....,a[n−1]a[0],a[1],...,a[k-1],....,a[n-1]a[0],a[1],...,a[k−1],....,a[n−1]前k个数的异或结果为 0,并且a[i]=a[i+m∗k],(0<=i<k,i+m∗k<n)a[i] = a[i+m*k],(0<=i<k,i+m*k<n)a[i]=a原创 2021-05-25 23:15:29 · 158 阅读 · 0 评论 -
LeetCode 664. 奇怪的打印机 (区间DP)
664. 奇怪的打印机状态:f[l][r]f[l][r]f[l][r]打印区间的花费,最基本的区间DP分治,f[l][r]=min{f[l][k],f[k+1][r]}f[l][r] = min\{f[l][k],f[k+1][r] \}f[l][r]=min{f[l][k],f[k+1][r]}动态转移方程,f[l][r]=f[l][r−1]f[l][r] = f[l][r-1]f[l][r]=f[l][r−1] 如果 s[l]==s[r]s[l]==s[r]s[l]==s[r],(f[l+1][r原创 2021-05-25 09:31:13 · 62 阅读 · 0 评论 -
LeetCode 546. 移除盒子 (很难的一道DP)
546. 移除盒子不解释官方的了。。。必须要知道的是,仅仅用[l,r][l,r][l,r]是不够记录状态的,子区间[l,r][l,r][l,r]不仅仅依赖于它的子区间,还依赖之前移动的顺序!官方题解class Solution {public: int dp[100][100][100]; int removeBoxes(vector<int>& boxes) { memset(dp, 0, sizeof dp); return原创 2021-05-25 09:23:02 · 111 阅读 · 0 评论 -
LeetCode 1035. 不相交的线 (双串DP)
1035. 不相交的线const int N = 510;class Solution {public: int maxUncrossedLines(vector<int>& nums1, vector<int>& nums2) { int f[N][N] = {0}; int n1 = nums1.size(), n2 = nums2.size(); for(int i = 1; i <= n1;原创 2021-05-21 02:40:58 · 53 阅读 · 0 评论 -
LeetCode 692. 前K个高频单词 (小根堆、map)
692. 前K个高频单词class Solution { public List<String> topKFrequent(String[] words, int k) { Map<String,Integer> count = new HashMap<>(); for(var s:words) { count.put(s,count.getOrDefault(s,0)+1); }原创 2021-05-20 12:03:36 · 50 阅读 · 0 评论 -
LeetCode 1738. 找出第 K 大的异或坐标值 (二维异或和)
1738. 找出第 K 大的异或坐标值class Solution {public: int kthLargestValue(vector<vector<int>>& matrix, int k) { int m = matrix.size(), n = matrix[0].size(); vector<vector<int>> s(m+1,vector<int>(n+1)); v原创 2021-05-19 10:31:37 · 148 阅读 · 0 评论 -
LeetCode 1442. 形成两个异或相等数组的三元组数目(异或、前缀、哈希表)
1442. 形成两个异或相等数组的三元组数目a==ba == ba==b转换为 (s[i]==s[k+1])(s[i] == s[k+1])(s[i]==s[k+1])s 代表异或的“前缀和”。class Solution {public: int countTriplets(vector<int>& arr) { int ans = 0; int n = arr.size(); vector<int> s(n原创 2021-05-18 16:52:24 · 59 阅读 · 0 评论 -
LeetCode.1269. 停在原地的方案数 (简单的DP)
1269. 停在原地的方案数const int MOD = (int)1e9 + 7;const int N = 510;class Solution {public: int numWays(int steps, int arrLen) { int f[N][N] = {0}; f[0][0] = 1; // f[s][i] = f[s-1][i-1] + f[s-1][i] + f[s+1][i+1]; for(int s原创 2021-05-14 00:29:41 · 50 阅读 · 0 评论 -
LeetCode 1734. 解码异或后的排列 (异或运算的性质)
1734. 解码异或后的排列关键是如何找到原数组的第一个或者最后一个数字。class Solution {public: vector<int> decode(vector<int>& encoded) { int n = encoded.size() + 1; int s1 = 0; for(int i = 0; i < n - 1; i += 2) { s1 ^= encoded[原创 2021-05-11 23:36:37 · 101 阅读 · 0 评论 -
LeetCode 276. 栅栏涂色 (二维DP、计数)
栅栏涂色文章目录方法1方法2拓展方法1状态表示f[i][j]f[i][j]f[i][j]表示第 i 个柱子涂颜色 j 的方案数u。DP公式f[i][j]=∑f(i−1,k)−(∑f(i−3,k)−f(i−3,j))f[i][j] = \sum f(i-1,k) - (\sum f(i-3,k)-f(i-3,j))f[i][j]=∑f(i−1,k)−(∑f(i−3,k)−f(i−3,j))时间复杂度:O(n∗k)O(n*k)O(n∗k)(有点容斥原理的意思 )const int N原创 2021-05-10 20:51:19 · 490 阅读 · 0 评论 -
LeetCode 1723. 完成所有工作的最短时间 (状态压缩DP)
1723. 完成所有工作的最短时间以人数为阶段进行考虑,考虑再多一个人的情况下,根据任务的分配状况 s, 如何进行转移。如果以任务的分配为阶段进行考虑,最好也就是O(n!)O(n!)O(n!)的复杂度了。DP公式:f[i][s]=min(f[i][s],max(f[i−1][j],sum[s−j]));f[i][s] = min(f[i][s],max(f[i-1][j],sum[s - j])); f[i][s]=min(f[i][s],max(f[i−1][j],sum[s−j]));时间原创 2021-05-08 22:51:12 · 213 阅读 · 0 评论 -
LeetCode 740. 删除并获得点数 (DP)
740. 删除并获得点数有点像 打家劫舍。const int N = 10010;class Solution {public: int deleteAndEarn(vector<int>& nums) { int a[N] = {0}; for(int x:nums) { a[x]++; } int ans = 0; int dp[N][2] = {0};原创 2021-05-05 16:12:19 · 52 阅读 · 0 评论 -
LeetCode 粉刷房子系列 一网打尽! (DP)
1473. 粉刷房子 III这道题的DP痕迹还是很重的。。。讲一下思路吧:每涂一个房子的颜色,不论是cost的变化,还是 block的变化,都只依赖上一个房子。使用dp完成再合适不过,三个维度的状态数组维护状态。O(m∗n2∗target)O(m*n^2*target)O(m∗n2∗target)const int M = 110;const int N = 30;const int inf = 0x3f3f3f3f;class Solution {public: int mi原创 2021-05-04 02:08:09 · 123 阅读 · 0 评论