- 博客(97)
- 资源 (5)
- 收藏
- 关注
原创 本人CSDN博客与知乎/公众号撰写内容区分通知
在此期间,首先感谢各位朋友的关注,是你们的支持才有我创作的动力。在过去的时间里,我分别在个人的CSDN、知乎、微信公众号和b站上撰写过一些文章或投稿过视频,通过在三个平台上的内容领域和质量观察,未来计划根据三个不同的平台撰写针对性的内容,具体撰写内容计划如下:本人CSDN:未来主要撰写关于运维、平台部署、各类bug解决、Leetcode等偏代码的内容本人知乎【阿亮算法】:未来主要撰写强化学习算法、xx算法原理、个人学习or科研心得、生活体会和思考等抽象类内容本人公众号【阿亮算法】:未来主要
2021-03-07 12:34:02 693 8
原创 Leetcode|基本二分搜索+左侧边界二分+右侧边界二分
文章目录1 基本二分搜索2 左侧边界二分3 右侧边界二分4 总结致谢1 基本二分搜索【区间】:[left, right]int binarySearch(vector<int>& nums, int target) { // 区间[left, right] int left = 0, right = nums.size() - 1; while (left <= right) { int mid = left + (right - le
2021-03-30 21:44:38 284
原创 Leetcode|树形排列|337. 打家劫舍 III
文章目录0 打家劫舍系列1 动态规划(记忆化递归)2 动态规划(一维树形状态转移)0 打家劫舍系列《Leetcode|线性排列|198. 打家劫舍》《Leetcode|环形排列|213. 打家劫舍 II》1 动态规划(记忆化递归)class Solution {private: unordered_map<TreeNode*, int> memo;public: int rob(TreeNode* root) { if (!root) return
2021-03-29 21:33:07 126
原创 Leetcode|环形排列|213. 打家劫舍 II
文章目录0 打家劫舍系列1 动态规划致谢0 打家劫舍系列《Leetcode|线性排列|198. 打家劫舍》1 动态规划class Solution {public: /**线性排列方法**/ int robRange(vector<int>& nums, int first, int end) { int size = end - first + 1; if (size == 1) return nums[first];
2021-03-29 17:36:59 153
原创 Leetcode|线性排列|198. 打家劫舍
1 动态规划【状态】:选择偷或者不偷对应房子的索引【选择】:①不偷第i家;②偷第i家【dp函数含义】:偷完前i家后所得最大金额为dp[i]【状态转移】: dp[i] = max(dp[i - 1], dp[i - 2] + nums[i])class Solution {public: int rob(vector<int>& nums) { int size = nums.size(); if (size == 1) return .
2021-03-29 16:50:31 125
原创 Leetcode|312. 戳气球(反向思维+区间动态规划)
1 动态规划(反向思维以分治)在求解问题前,考虑到作为状态的累计钱币数没有已知上限,是待求量。因此不能将累计钱币数作为dp索引,因此,我们要分析,这个问题能不能分解成小问题破解?显然,如果是按照先戳破第k个气球来思考,子问题之间是相互依赖的,问题只能分解,不能将小问题的解正确的合成。所以我们要做的是如何分解可以使得小问题之间相互独立?很多题解上来就说反向思维,但不会告诉你如何想到反向思维?其实是依靠正向逻辑的,只要按照正向逻辑,不论前向,后向还是什么左向右向思维都可以训练出来!!想要子问题相互独立.
2021-03-29 15:34:13 182
原创 Leetcode|887. 鸡蛋掉落(动规找最优BST根节点 + 将解作为状态)
文章目录1 动态规划(递归超时)2 动态规划(二分搜索优化,5%beat,1400ms)3 动态规划(将解作为状态,100%beat,0ms)致谢1 动态规划(递归超时)【状态】:①第i层扔碎了;②第i层扔没碎【dp函数含义】:剩余k个鸡蛋,有n层楼时,最坏情况下最少扔鸡蛋的次数为dp(k, n)【初始化】:状态有两个,因此需分别初始化,当楼层为0时,最少扔蛋次数为0;当剩余鸡蛋仅1个时,需做线性扫描,因此最坏情况下最少扔蛋次数为n【状态转移】minCont表示N课BST树中最小深度BST
2021-03-29 10:34:09 157
原创 Leetcode|651. 4键键盘(压缩成A和CV两键)
动态规划题目中提到的有四个按键,但实际上,我们可以压缩为2个选择,因为对于最优解,Ctrl+V一定在Ctrl+A-Ctrl+C两个按键后【dp数组含义】:按键i次后屏幕显示dp[i]个A【状态】:剩余可按键数量N【选择】:①按A; ②按Ctrl+V【状态转移方程】:dp[i] = max(dp[i - 1] + 1, dp[j - 2] * (i - j + 1));class Solution {public: int maxA(int N) { // dp数.
2021-03-26 21:24:02 328 1
原创 Leetcode|线性序列|10. 正则表达式匹配(两字符串前均补1个相同字符)
1 动态规划本题逻辑如下[1] if 两字符相同(或遇到.通配符)则两索引i,j同步后移1位[2] if 若两字符不同,且是因为遇到*通配符——[2.1] *通配符前1位字符p[j-1]与s[i]相同 → (0次 || 多次匹配) eg.s = aaa, p = a*——[2.2] *通配符前1位字符p[j-1]与s[i]不同 → 0次匹配 eg.s = aa, p = c*aa大多数本题题解都用的递归实现动态规划,但本题我使用dp数组,其初始化比递归实现简洁不少,但其中细节并不简单,特此..
2021-03-26 16:26:08 196
原创 Leetcode|线性序列|1312. 让字符串成为回文串的最少插入次数
1 动态规划本题解法与《Leetcode|线性序列|516. 最长回文子序列》高度相似【dp数组含义】:子串s[i, j]最少需要dp[i][j]次插入次数【状态转移方程】:两字符相等dp[i][j] = dp[i + 1][j - 1];两字符不等——则需考虑s[i + 1,j]和s[i,j - 1]dp[i][j] = min(dp[i + 1][j], dp[i][j - 1]) + 1;class Solution {public: int minInser..
2021-03-25 10:45:28 142
原创 Leetcode|线性序列|516. 最长回文子序列
1 动态规划【dp数组含义】:s[i, j]的子序列最长为dp[i][j]【状态转移方程】:两字符相等——则回文子序列长度自增2dp[i][j] = dp[i + 1][j - 1] + 2;两字符不等——比较添加s[i]或s[j]可以增长子序列dp[i][j] = max(dp[i][j - 1], dp[i + 1][j]);完整代码如下class Solution {public: int longestPalindromeSubseq(string s) {.
2021-03-25 09:18:02 141
原创 Leetcode|线性序列|5. 最长回文子串(动规+双指针中心扩展)
文章目录0 前言1 动态规划2 双指针(中心扩展)0 前言本题和《Leetcode|线性序列|647. 回文子串》 很像,只是转而输出最长回文子串,但方法相同,单独对比每次回文子串大小,取最大和对应子串起始索引即可1 动态规划【dp数组含义】表示区间范围s[i,j] 的子串是否是回文子串,如果是dp[i][j]为true,否则为false当s[i] == s[j]时有如下两种情况共1个字符或2个相邻字符多个字符(>2)则需要判断s[i+1, j-1]内是否回文串class So
2021-03-24 23:37:37 187
原创 Leetcode|线性序列|647. 回文子串(暴力+动规+双指针中心扩展)
文章目录1 暴力解法2 动态规划3 双指针(中心扩展)1 暴力解法时间复杂度:O(n3)O(n^3)O(n3)空间复杂度:O(1)O(1)O(1)class Solution { public: bool valid(string& s, int first, int end) { for (int i = first, j = end; i < j; i++, j--) if (s[i] != s[j]) return fa
2021-03-24 17:50:35 183
原创 Leetcode|线性序列|409. 最长回文串(贪心算法)
1 贪心算法class Solution {public: int longestPalindrome(string s) { map<char, int> ch2cnt; for (auto& ch : s) ch2cnt[ch]++; int count = 0; // 是否有奇数 int isOdd = false; for (auto& m : ch2cnt) .
2021-03-24 15:53:13 304
原创 Leetcode|线性序列|72. 编辑距离
1 动态规划三个操作示意图如下边界初始化【状态转移方程】:// [1]删除1个字符 [2]插入一个字符 [3]替换1个字符 dp[i][j] = min(dp[i - 1][j] + 1, dp[i][j - 1] + 1, dp[i - 1][j - 1] + 1)class Solution {public: int minDistance(string word1, string word2) { .
2021-03-23 20:09:55 138
原创 Leetcode|线性序列|712. 两个字符串的最小ASCII删除和(变相LCS)
1 动态规划(变相最长公共子序列)【本题特点】:dp数组不仅能存储子序列的长度,还能存储子序列本身,确实可以很灵活dp[i][j] = dp[i - 1][j - 1] + s1[i - 1];dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);class Solution {public: int minimumDeleteSum(string s1, string s2) { int asize = s1.size(); .
2021-03-23 16:18:54 99
原创 Leetcode|线性序列|583. 两个字符串的删除操作(变相LCS)
1 动态规划(二维动态规划)class Solution {public: int minDistance(string word1, string word2) { int asize = word1.size(); int bsize = word2.size(); vector<vector<int>> dp(asize + 1, vector<int>(bsize + 1, 0)); f.
2021-03-23 15:39:09 97
原创 Leetcode|线性序列|1143. 最长公共子序列(LCS二维动态规划)
动态规划class Solution {public: int longestCommonSubsequence(string text1, string text2) { int asize = text1.size(); int bsize = text2.size(); vector<vector<int>> dp(asize + 1, vector<int>(bsize + 1, 0)); .
2021-03-23 15:20:46 112
原创 Leetcode|线性序列|53/42. 连续子数组的最大和(暴力+贪心+动态规划包含结尾元素)
文章目录1 暴力 + sum小于0剪枝2 动态规划(未状态压缩)3 动态规划 (状态压缩)1 暴力 + sum小于0剪枝class Solution { public: int maxSubArray(vector<int>& nums) { int size = nums.size(); int maxSum = INT_MIN; for (int i = 0; i < size; i++) {
2021-03-23 11:15:06 199
原创 Leetcode|线性序列|354.俄罗斯套娃信封问题
动态规划(二维最长递增子序列问题)将一维问题简单扩展到二维,即两维同时升序(18%beat,约1400ms)class Solution {public: static bool cmp(vector<int>& a, vector<int>& b) { if (a[0] == b[0]) return a[1] < b[1]; return a[0] < b[0]; } int maxE.
2021-03-23 09:01:43 129
原创 Leetcode|完全背包|139. 单词拆分
1 动态规划(完全背包)class Solution {public: bool wordBreak(string s, vector<string>& wordDict) { int bagSize = s.size(); vector<bool> dp(bagSize + 1, false); dp[0] = true; for (int j = 1; j <= bagSize; j++).
2021-03-22 21:38:10 132 1
原创 Leetcode|完全背包|279. 完全平方数
1 动态规划(完全背包)没啥好说的,完全背包走就行了class Solution {public: int numSquares(int n) { vector<int> dp(n + 1, INT_MAX); dp[0] = 0; for (int i = 1; i * i <= n; i++) // 物品 for (int j = i; j <= n; j++) // 背包容量 .
2021-03-22 19:38:13 100
原创 Leetcode|排列+完全背包|70. 爬楼梯
1 动态规划(完全背包)太简单了, 排列+完全背包,直接上模板class Solution {public: int climbStairs(int n) { vector<int> dp(n + 1, 0); dp[0] = 1; for (int j = 1; j <= n; j++) for (int i = 1; i <= 2; i++) if (j >.
2021-03-22 17:14:28 101
原创 Leetcode|完全背包|518. 零钱兑换 II
1 动态规划(完全背包)class Solution {public: int change(int amount, vector<int>& coins) { vector<int> dp(amount + 1, 0); dp[0] = 1; for (int i = 0; i < coins.size(); i++) // 完全背包:背包容量for循环升序 .
2021-03-22 16:34:41 109
原创 Leetcode动态规划模板
文章目录0 前言1 解题思考模式1.1 能不能用动态规划做?1.2 怎么用动态规划做?(七步走)2 动态规划模板2.1 通用模板2.2 背包模板2.2.1 01背包模板2.2.2 完全背包模板致谢0 前言路径基本要素说明核心基础穷举法需“聪明”穷举存在问题重叠子问题有众多相同子问题(eg.多个f(18)),需记录具备特点最优子结构原问题的解包含子问题的解状态转移思维模式自顶向下(推荐)当前状态如何由前一个状态推出目前所遇动态规划问题一般形式包
2021-03-22 15:54:31 720
原创 Leetcode|01背包|474. 一和零(二维01背包)
1 动态规划(二维01背包)【dp[i][j]数组含义】:容量0的个数最多为i且1的个数最多为j的情况下,两个维度容量的背包下最多的子集数【状态转移方程】:dp[i][j] = max(dp[i][j], dp[i - cont0][j - cont1] + 1)class Solution {public: int findMaxForm(vector<string>& strs, int m, int n) { int size = strs.siz.
2021-03-21 17:47:18 148
原创 Leetcode|01背包|494. 目标和(回溯法+01背包)
1 回溯法(AC,29%beat,745ms)回溯法需做好剪枝优化和记录结果的数据结构不能太复杂就能飘过,比如不能用vector记录结果class Solution {private: int size; int count = 0; int sum = 0;public: void backtrack(vector<int>& nums, int curSum, int first) { if (curSum == sum) c.
2021-03-21 15:18:55 210
原创 Leetcode|01背包|1049. 最后一块石头的重量 II(两背包)
动态规划(两个01背包)背包1 - 背包2 = (sum - 背包2) - 背包2class Solution {public: int lastStoneWeightII(vector<int>& stones) { int size = stones.size(); int sum = accumulate(stones.begin(), stones.end(), 0); int halfSum = sum / 2;.
2021-03-20 19:51:06 181
原创 Leetcode|01背包|416. 分割等和子集
动态规划(01背包问题)【dp数组含义】:容量(和)为j的情况下,能达到的最大容量(和)dp[j]【状态转移方程】:dp[j] = max(dp[j], dp[j - nums[i]] + nums[i])最后判断dp[halfSum]是否等于halfSum即可class Solution {public: bool canPartition(vector<int>& nums) { int size = nums.size(); i.
2021-03-20 17:01:45 127 1
原创 Leetcode|线性序列|300. 最长递增子序列
1 动态规划注意:dp数组的定义一定要正确,否则难以定义正确的状态转移方程【本题dp数组定义】:dp[i]表示前i个元素中最长递增子序列长度(必须包含第i个尾元素, 否则无法确定状态如何转移)class Solution {public: int lengthOfLIS(vector<int>& nums) { int size = nums.size(); // dp[i]表示前i个元素中最长递增子序列长度(必须包含第i个尾元素, .
2021-03-18 16:01:38 132
原创 Leetcode|完全背包|322. 零钱兑换
1 动态规划实际状态转移方程如下:dp[状态i] = min(1 + dp[状态i - 选择1], 1 + dp[状态i - 选择2], 1 + dp[状态i - 选择3]....);其中,我们对多个元素求最小怎么求的?是不是下面这样int maxNum = INT_MAX;for (int i = 0; i < size; i++) maxNum = min(maxNum, num[i]);所以就有了状态转移方程在程序中的主流表现形式dp[状态i] = min(dp[状态i],.
2021-03-18 12:41:46 99
原创 Leetcode|简单|区间贪心|42/53. 最大子序和(暴力+贪心+动规)
文章目录1 暴力法2 区间贪心算法1 暴力法时间复杂度:O(n2)O(n^2)O(n2)class Solution {public: int maxSubArray(vector<int>& nums) { int maxSum = INT_MIN; for (int i = 0; i < nums.size(); i++) { int sum = 0; int curSum = I
2021-03-18 10:26:51 108
原创 Leetcode|中等|区间贪心|763. 划分字母区间(双指针+哈希表助力合并重叠区间)
文章目录1 区间贪心(双指针未优化)2 区间贪心(双指针+哈希表助力合并重叠区间)致谢1 区间贪心(双指针未优化)一开始,很容易想到用双指针去定位两个相同字符的最远区间,然后使用重叠区间合并的思维去得到最终片段。大方向双指针思路是对的,不过没有优化,所以复杂度较高,但能ACclass Solution {public: vector<int> partitionLabels(string S) { if (S.empty()) return {};
2021-03-17 20:52:30 122
原创 Leetcode|中等|区间贪心|56. 合并区间
1 贪心算法一次遍历重叠则合并不重叠则添加class Solution {public: static bool cmp(const vector<int>& a, const vector<int>& b) { return a[0] < b[0]; } vector<vector<int>> merge(vector<vector<int>>& i.
2021-03-17 16:30:14 113
原创 Leetcode|中等|区间贪心|452. 用最少数量的箭引爆气球
1 区间终点贪心没啥好说的,和无重叠区间一样,只是依据条件,相切的那个点也算,总之很简单啦class Solution {private: static bool cmp(const vector<int>& a, const vector<int>& b) { return a[1] < b[1]; }public: int findMinArrowShots(vector<vector<int&..
2021-03-17 15:07:07 112
原创 Leetcode|中等|区间贪心|435. 无重叠区间
1 区间终点贪心没啥好说的,贪心算法中最简单的题,《算法设计与分析》教科书中贪心章节的第一道典例class Solution {private: static bool cmp(const vector<int>& a, const vector<int>& b) { return a[1] < b[1]; }public: int eraseOverlapIntervals(vector<vector&l.
2021-03-17 14:46:44 113
原创 Leetcode|中等|区间贪心|45. 跳跃游戏II
贪心算法class Solution {public: int jump(vector<int>& nums) { int size = nums.size(); // 当前覆盖终点索引 int cover = 0; int fastTarget = 0, count = 0; // 注意:i∈[0, size - 2] for (int i = 0; i < siz.
2021-03-17 14:17:13 122
原创 Leetcode|中等|区间贪心|55. 跳跃游戏
1 贪心算法【问题转化】:跳跃覆盖范围能否覆盖终点索引?只要覆盖到了,你愿跳几步跳几步,怎么都能跳出去,因此关键问题不在于跳几步可以恰好到终点,而是能否覆盖到终点,问题一转换,一下子就好解决了!!局部最优:每次取最大跳跃步数(取最大覆盖范围)整体最优:最后得到整体最大覆盖范围,看是否能到终点。class Solution {public: bool canJump(vector<int>& nums) { if (nums.size() == 1.
2021-03-17 10:32:28 137
原创 Leetcode|困难|两维度贪心|135. 分发糖果(前向贪心+后向贪心)
1 双向贪心算法贪心策略:从左到右遍历,只比较右孩子评分比左边大的情况从右到左遍历,只比较左孩子评分比右边大的情况class Solution {public: int candy(vector<int>& ratings) { int size = ratings.size(); vector<int> num(size, 1); // 1.前向贪心 for (int i = 1; i.
2021-03-17 00:00:01 238
原创 Leetcode|中等|两维度贪心|406. 根据身高重建队列(固定1维贪心再贪心另1维)
1 两维度贪心算法(链表版)【贪心】:先对两维度中的(第一维)身高降序排序,其中等高者,(第二维)其前方人数k少的排前面局部最优:优先将高个子的people按其前方人数k来插入,这样后面低个子往前插入时不破坏高个子属性全局最优:最后都做完插入操作,整个队列满足题目队列属性排序完的people:[[7,0], [7,1], [6,1], [5,0], [5,2],[4,4]]插入的过程:插入[7,0]:[[7,0]]插入[7,1]:[[7,0],[7,1]]插入[6,1]:[[7,0].
2021-03-16 21:29:42 96
Jclasslib_win64bit
2018-12-03
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人