随笔分类 - LeetCode
摘要:题目 题解: 对于每个元素,它只有当左边的元素大于它的时候才能被删去。 维护一个数组,dp dp[i]表示第i个元素被删去需要多少步 维护一个单调递减的栈,用来查找每个元素的左边的第一个大于它的元素的位置 对于每个元素i,假设左边第一个大于的元素的位置是k,那么元素i需要等待区间[i-k]的元素都被
阅读全文
摘要:恢复内容开始 第一题 简单的二分查找 class Solution { public: int findFinalValue(vector<int>& nums, int original) { sort(nums.begin(), nums.end()); while(find(original,
阅读全文
摘要:题目 题意: 两个拍排好序的数组,a, b 问你第k小的两个数组的元素乘积是多大。 题解: 两个数组的元素乘积最小是-105 * 105 最大是105 * 105 我们可以在这个范围内做二分,那么问题的关键就是能不能给你一个数,让你找到有多少个元素乘积小于这个数,复杂度最多n*log(n) 其实可以
阅读全文
摘要:题目 题解,动态规划 因为m 最大只有5,所以我们可以枚举5个相邻的块,最多有多少种可能, 然后分析每个是否能与其他几个并排,然后就是简单的BP了 class Solution { public: int dp[50][5]; int bp[5]; int num[50]; long long in
阅读全文
摘要:题目 在一个数组里面找到两个数异或的结果在某个范围之内。 这种题目,就要用二叉树, 代码写的又臭又长。。 struct Node { int value; int left; int right; int num; int pos; }tree[200005]; class Solution { p
阅读全文
摘要:题目 毫无意义的题目。 class Solution { public: int countNumbersWithUniqueDigits(int n) { if(n==0) return 1; int ans=0; for(int i=1;i<=n;i++) { ans+=fun(i); } re
阅读全文
摘要:题目 题意: 对于树上的每个节点,找出与它的值互质的最近的祖先节点。 题解: 由于节点上的值在1-50之间,所以算互质很好算,事先算法。然后就是深度优先遍历树的时候维护路径上的节点的位置,利用1-50这个小范围,快速找到与当前节点值互质的值出现在哪些位置上 struct Node { int val
阅读全文
摘要:https://leetcode.com/problems/building-boxes/ 题意:在一个边长是n的立方体中放n个方块,方块可以叠加,但是被叠加的在下方的方块八面必须挨着墙或者别的方块。 问最底部最少可以放多少个方块。 这是一道找规律的题目,我们可以找出底部方块的个数m和最多可以放n个
阅读全文
摘要:题目 题意:判断一个字符串是否可以由三个回文串组成 题解:利用强大的回文树,计算出以每个字符为结尾的回文串,然后从字符串的最后一个字符开始,递归判断。 struct Tree { int next[4005][30]; int fail[4005]; int cnt[4005]; int num[4
阅读全文
摘要:题目 题意:从一个数组找出一个子集,使得子集的和给定的目标最相近。 题解:数组的长度为40,找出全部子集一共有240种可能性,如果把一个数组平均分成两部分,分别算出两部分的所有子集和,每部分有220种可能, 然后再二分查找答案。 遇到这种在数组里找所有子集和, class Solution { pu
阅读全文
摘要:题目 题意:将n个数分成k组,使得k组中的最大值最小。 题解:暴力DFS,但是要注意两个地方剪枝,首先在DFS的过程中判断当前的最大值是不是已经超过了已有答案。 第二个剪枝的地方比较triky,由于我们对k组没有顺序要求的,所以当剩下的组都是空的时候,我们只需要DFS第一个组。 class Solu
阅读全文
摘要:题目 拖了两个月,终于这这道题目AC了。 思路是贪心,将所有的元素从小到大排序。并且维护两个数组,一个数组代表每一行的当前已经填上的最大的rank,比如nrank[0]=2 表示第0行,目前已经填到了rank=2,下一个再填就一定是>=2的数字。 同理列也是。一开始nrank[],和mrank[]都
阅读全文
摘要:题目 题解: 动态规划,用二进制压缩状态,注意分析几种情况,就能推出来正确的状态转移方程。 class Solution { public: int dp[12][4096]; int connectTwoGroups(vector<vector<int>>& cost) { int n = cos
阅读全文
摘要:题目 题意:一个只有0-9组成的字符串,每次选择任意一个子串,按照数字从小到大排序。问从源字符串能否经过若干次操作转换成目标字符串。 题解:首先题目只问了是否,而没有问多少次,所以可以判断出,我们不关心过程是怎么样的,只关心结果能否到达。所以不太可能是动态规划,搜索什么的。 既然是看结果,那估计是个
阅读全文
摘要:题目 题意:一堆橘子,要么吃一个,如果橘子数量能被2整除就可以吃一半,如果橘子数量能被3整除就可以吃三分之二,请问最少几次能吃完? 题解:橘子的个数是n,按照贪心的思想,肯定是吃一半或者吃三分之二划算。因此每一步,都有两种选择,要么一个一给吃,吃到能被2整除,然后吃掉一半。要么一个一个吃,吃到能被3
阅读全文
摘要:题目 区间DP,由于棍子长100万,所以我们在cuts之间做区间DP。 那么状态转移方程就是很简单直白的区间DP dp[i][j] = min { dp[i][k-1] + cost(k) + dp[k+1][j]} i<=k<=j cost(k) 表示 从k处切断的cost class Solut
阅读全文
摘要:题目 题意:在一个数组中,找到最多的不相交的子序列,每个子序列的和等于target。 题解:动态规划 dp[i]表示从0到i的子数组的答案。维护前缀数组sums[],我们维护一个记录前缀和的map,map[x]表示前缀和是x距离当前i最近的下标。 那么状态转移方程就是dp[i] = max(dp[i
阅读全文
摘要:题目 一道好题目,把最长递增子序列扩展到二维,但是这道题和最长递增子序列是有区别的,它不要求是序列,只是在数组中找到一组最长的组合,不要求顺序在初始中相同。 这是个二维的最长递增子序列,由于没有顺序限制,所以我们把第一维进行排序,然后对第二维进行动态规划 接下来就和最长递增子序列的思路一样: 效率是
阅读全文
摘要:题目 class Solution { public: bool isPowerOfThree(int n) { double x = log10(n) / log10(3); return n>0 && (abs((int)x - x) < 0.000000000000001); } };
阅读全文
摘要:题目 这道题目很有意思,有意思的是使用O(n)的时间效率和O(1)的空间效率解决。我会写一篇专业的博客来介绍一下 以下就是O(n)的时间效率和O(1)的空间效率。 class Solution { public: int n; int findKth(vector<int>& nums, int s
阅读全文