LeetCode
LeetCode刷题过程中遇到的比较经典的题都归纳在这里
zhcblog
从事云计算分布式存储相关工作
展开
-
LeetCode 打家劫舍系列问题 (练DP很好的例子)
打家劫舍I(动态规划)打家劫舍II(动态规划)打家劫舍III(树型DP)打家劫舍I(动态规划) 状态表示:dp[i][0/1]表示第i个房子偷或不偷的最高金额 初始边界:dp[0][] = {0,0} 转移方程: 当前房子不偷:dp[i][1] = dp[i-1][0] + nums[i] 当前房子偷: dp[i][0] = max{dp[i-1][0],dp[i-1][1]} int rob(vector<int>&.原创 2020-06-04 15:20:39 · 442 阅读 · 0 评论 -
LeetCode 421.数组中两个数的最大异或值 (前缀树+位运算+贪心)
题目描述思路总的来说就只需要两步:将数组中的数全部存入字典树中遍历树中的每一个数在字典树中异或的最大结果,最后再求最大结果里面的最大值返回也可以将1、2两步写在一个循环里面,也可以分开写,时间复杂度都是一样的class Trie{public: Trie* next[2]; Trie() { memset(next, 0, sizeof(next)); }};class Solution { Trie* root = new T原创 2020-06-03 14:52:13 · 350 阅读 · 0 评论 -
LeetCode 96.不同的二叉搜索树(卡特兰数列)
题目描述记忆化搜索对于每个节点而言都可以在区间1到n中取一个数作为根节点,比如这里取i,则左子树能在根节点1 – i - 1中取值作为根节点,右子树能在i + 1 – n中取值作为根节点。最后当前节点能取的可能就是左右子树能取可能情况的乘积。对于子树节点我们可以以同样的方式递归地去求。由于这样会有很多重复的计算,所以我们用一个map来记录已经计算过的结果,避免重复计算,这就是记忆化搜索。 unordered_map<string,int> mp; int numTrees原创 2020-06-01 15:39:04 · 270 阅读 · 0 评论 -
LeetCode 1371签到题 每个元音包含偶数次的最长子字符串 (位运算)
题目描述提示:1 <= s.length <= 5 x 10^5s 只包含小写英文字母。思路描述:首先题目中要求子字符串中每个元音字母恰好出现偶数次,我们就可以使用0和 1 来标识每个字母的状态(偶数次或奇数次),我们不需要知道每个字母出现的完整次数,只需要知道这个次数的奇偶性那么我们可以注意到奇数次+ 1 = 偶数次,偶数次 + 1 = 奇数次,所以我们可以使用 异或 来参与运算: 比如 aba初始时 status = 00000,然后到 a的时候00000 ^ 00001原创 2020-05-20 12:16:24 · 320 阅读 · 0 评论 -
LeetCode 10正则表达式匹配 (动态规划)
题目描述回溯老样子,写不出来动态规划先写暴力递归:如果没有星号(正则表达式中的 * ),问题会很简单——我们只需要从左到右检查匹配串 s 是否能匹配模式串 p 的每一个字符。当模式串中有星号时,我们需要检查匹配串 s 中的不同后缀,以判断它们是否能匹配模式串剩余的部分。一个直观的解法就是用回溯的方法来体现这种关系如果模式串中有星号,它会出现在第二个位置,即 pattern[1]。这种情况下,我们可以直接忽略模式串中这一部分,或者删除匹配串的第一个字符,前提是它能够匹配模式串当前位置字符,即pat原创 2020-05-18 15:58:50 · 378 阅读 · 0 评论 -
LeetCode 4.寻找两个正序数组的中位数 (二分查找)
题目描述解法一:申请两个堆,分别为大顶堆和小顶堆,可以用优先队列实现。维护这两个堆,使得大顶堆里面的元素都小于小顶堆里面的元素,同时大顶堆里面元素的个数与小顶堆里面的元素个数相差不能超过1。将数组里面的数都装入堆中后,则中位数就是两个堆的堆顶元素如果两个数组的元素之和为奇数的话就是堆中元素个数较多的堆顶元素。如果两个数组元素之和为偶数的话就是堆顶 元素的平均值。 void pushNum(priority_queue<int,vector<int>,grea原创 2020-05-18 10:47:13 · 268 阅读 · 0 评论 -
Leetcode 221.最大的正方形面积 (动态规划)
题目描述思路先将问题转化为求最大矩阵的边长状态表示:dp[i][j]表示以i,j为右下角的最大矩阵边长初始状态:dp[0][0 -> n]等于matrix[0][0 -> n] ,dp[0->m][0] 等于matrix[0->m][0]状态转移:dp[i][j] = min(min(dp[i-1][j], dp[i][j-1]), dp[i-1][j-1]) ...原创 2020-05-07 17:07:02 · 813 阅读 · 1 评论 -
LeetCode 1277.统计全为1的正方形子矩阵数量(动态规划)
题目描述首先,暴力解就是以矩阵每一个点为起点,依次判断边长为1,2,3,...,min(矩阵长, 矩阵宽)的区域是否是正方形,显然复杂度是过不了。很容易知道,上述过程在判断较大区域是否为正方形的时候,并没有用到前面计算的结果,每一次判断都从头开始。这也是复杂度过高的原因。那么怎么利用之前判断过的结果呢?举个例子,比如我要判断以(2, 3)为右下角边长为3的正方形区域(红色边框区域)是否是全...原创 2020-05-07 16:26:06 · 1028 阅读 · 0 评论 -
LC. 16.11面试题 跳水板(动态规划)
今天刷题遇到一道特别奇葩的题,看起来是用动态规划解,题型分类也是动态规划,但是用动态规划确实TML,而最优解法感觉却有点像“脑筋急转弯”,I fulo U, 还是太菜了。题目描述我的解法:1. 记忆化(TML) vector<int> ans; int l, s; set<string> st; void dfs(int k, in...原创 2020-05-01 23:18:12 · 316 阅读 · 0 评论 -
LC421.数组中两个数的最大异或结果-Trie树
题目描述解题思路总的来说就只需要两步将数组中的数全部存入字典树中遍历树中的每一个数在字典树中异或的最大结果,最后再求最大结果里面的最大值返回就是了class Trie{public: // map<int, vector<int>> next; Trie* next[2]; Trie() { memset(next...原创 2020-04-12 16:21:41 · 141 阅读 · 0 评论 -
LC313.超级丑数(这个数超级丑) - 动态规划
题目描述解题思路这题的解法和第K个丑数(戳这里)解法一样,只是在第K个丑数的基础上扩展了一下,下面的代码就是对比第K个丑数写出来的。 int nthSuperUglyNumber(int n, vector<int>& primes) { // int idx2 = 0, idx3 = 0, idx5 = 0; vector<...原创 2020-04-11 16:37:14 · 175 阅读 · 0 评论 -
LC 求丑数(这个数的确很丑)- 动态规划
题目描述思路定义三个指针idx3,idx5,idx7,idx3指向的数字永远乘3,idx5指向的数字永远乘5,idx7指向的数字永远乘7初始化所有指针都指向第一个丑数,即1我们从dp[idx3]*3,dp[idx5]*5,dp[idx7]*7选取最小的一个数字,作为新的丑数。这边新的丑数就是3*dp[idx3]=3*1=3,然后idx3++此时idx5和idx7指向第1个丑数,idx3指...原创 2020-04-11 15:52:41 · 384 阅读 · 0 评论 -
LC22.括号生成-回溯
题目描述解题思路我们可以采用递归回溯的思路,用两个变量分别记录左括号和有括号使用的次数,然后对于当前的位置i我们可以放置左括号,也可以放置有括号(第一个位置除外)。所以对于每一层递归我们就可以把放置左右括号分别继续递归,相应的左右括号使用次数对应的做+1就可以了。最后递归的边界就是答案字符串等于2倍的n vector<string> ans; int num; ...原创 2020-04-09 18:03:50 · 166 阅读 · 0 评论 -
LC315.计算右侧小于当前元素的个数
题目描述解题思路戳这里有篇 优质题解 vector<int>index; vector<int> countSmaller(vector<int>& nums) { if(!nums.size()) return {}; vector<int>res(nums.size(),0); ...原创 2020-04-09 17:54:04 · 147 阅读 · 0 评论 -
数组小和-归并排序
题目描述给定一个数组arr,求arr每个位置arr[i]左边≤arr[i]的数的和,最后返回每个位置的总和sum。示例:输入:arr[] = {2,5,4,7}输出:sum = 15sum[0] = 0sum[1] = 2sum[2] = 2sum[3] = 2 + 5 + 4 = 11sum = sum[0] + sum[1] + sum[2] + sum[3] = 15...原创 2020-04-09 17:45:00 · 169 阅读 · 0 评论 -
LC493. 翻转对-归并排序
题目描述思路: 利用归并排序的思想当我们希望在数组中求出逆序对的数目时,我们可以使用归并排序的方法。这道题中i < j 且 nums[i] > 2 * nums[j]的要求与逆序对类似,因此我们也可以使用归并排序的方法求出翻转对的数目。在归并排序中,当我们归并两个子数组 nums[start .. mid]和 nums[mid + 1 .. end] 时,我们可以计算出对于前者中...原创 2020-04-09 17:23:24 · 169 阅读 · 0 评论 -
LeetCode 股票买卖问题(动态规划)
很多读者抱怨股票系列问题奇技淫巧太多,如果面试真的遇到这类问题,基本不会想到那些巧妙的办法,怎么办?所以本文拒绝奇技淫巧,而是稳扎稳打,只用一种通用方法解决所用问题,以不变应万变。这篇文章用状态机的技巧来解决,可以全部提交通过。不要觉得这个名词高大上,文学词汇而已,实际上就是 DP table,看一眼就明白了。先随便抽出一道题,看看别人的解法:int maxProfit(vector...转载 2020-04-02 21:43:47 · 465 阅读 · 0 评论 -
LeetCode 约瑟夫环(动态规划)
面试题62. 圆圈中最后剩下的数字题目描述法一:链表模拟(超时)直接模拟删除的过程,比如开始的时候是从0位置开始遍历,每隔m删除一个数,当我们在依次遍历m-1位置的同时,将它们依次移动到链表的末尾。当遍历到m位置的时候就不添加到链表末尾而是直接删除,重复此过程直到剩下最后一个数为止。 int lastRemaining(int n, int m) { list<in...原创 2020-03-25 18:37:33 · 4157 阅读 · 2 评论 -
LeetCode只出现一次的数字I~III(位运算)
136. 只出现一次的数字题目描述给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?示例 1:输入: [2,2,1]输出: 1示例 2:输入: [4,1,2,1,2]输出: 4解题思路位运算:从头到尾对每个数进行一遍^运算最后得到的那个数就是出现一...原创 2020-03-24 22:42:04 · 251 阅读 · 0 评论