博客园 - Shendu.CCuuid:6cbd1ba2-f883-4c34-aed1-30dde64a3a3e;id=6928272024-01-11T12:24:26ZShendu.CChttps://www.cnblogs.com/dacc123/feed.cnblogs.comhttps://www.cnblogs.com/dacc123/p/17959444Happy New Year! 2024 第一题 - Shendu.CCA. Theatre Square time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard output Theatre Square in the capit2024-01-11T12:24:00Z2024-01-11T12:24:00ZShendu.CChttps://www.cnblogs.com/dacc123/【摘要】A. Theatre Square time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard output Theatre Square in the capit <a href="https://www.cnblogs.com/dacc123/p/17959444" target="_blank">阅读全文</a>https://www.cnblogs.com/dacc123/p/16341107.htmlLeetcode 2289. Steps to Make Array Non-decreasing (单调栈) - Shendu.CC题目 题解: 对于每个元素,它只有当左边的元素大于它的时候才能被删去。 维护一个数组,dp dp[i]表示第i个元素被删去需要多少步 维护一个单调递减的栈,用来查找每个元素的左边的第一个大于它的元素的位置 对于每个元素i,假设左边第一个大于的元素的位置是k,那么元素i需要等待区间[i-k]的元素都被2022-06-03T16:46:00Z2022-06-03T16:46:00ZShendu.CChttps://www.cnblogs.com/dacc123/【摘要】题目 题解: 对于每个元素,它只有当左边的元素大于它的时候才能被删去。 维护一个数组,dp dp[i]表示第i个元素被删去需要多少步 维护一个单调递减的栈,用来查找每个元素的左边的第一个大于它的元素的位置 对于每个元素i,假设左边第一个大于的元素的位置是k,那么元素i需要等待区间[i-k]的元素都被 <a href="https://www.cnblogs.com/dacc123/p/16341107.html" target="_blank">阅读全文</a>https://www.cnblogs.com/dacc123/p/15966108.htmlLeetCode Weekly Contest 281 - Shendu.CC第一题 class Solution { public: int countEven(int num) { int ans = 0; for(int i=1;i<=num;i++) { int res = 0; int x = i; while(x) { res+= (x%10); x/=10; }2022-03-04T12:58:00Z2022-03-04T12:58:00ZShendu.CChttps://www.cnblogs.com/dacc123/【摘要】第一题 class Solution { public: int countEven(int num) { int ans = 0; for(int i=1;i<=num;i++) { int res = 0; int x = i; while(x) { res+= (x%10); x/=10; } <a href="https://www.cnblogs.com/dacc123/p/15966108.html" target="_blank">阅读全文</a>https://www.cnblogs.com/dacc123/p/15881603.htmlLeetCode weekly contest 278 (amazon pay) - Shendu.CC恢复内容开始 第一题 简单的二分查找 class Solution { public: int findFinalValue(vector<int>& nums, int original) { sort(nums.begin(), nums.end()); while(find(original,2022-02-10T16:01:00Z2022-02-10T16:01:00ZShendu.CChttps://www.cnblogs.com/dacc123/【摘要】恢复内容开始 第一题 简单的二分查找 class Solution { public: int findFinalValue(vector<int>& nums, int original) { sort(nums.begin(), nums.end()); while(find(original, <a href="https://www.cnblogs.com/dacc123/p/15881603.html" target="_blank">阅读全文</a>https://www.cnblogs.com/dacc123/p/15803370.htmlLeetCode 2040. Kth Smallest Product of Two Sorted Arrays - Shendu.CC题目 题意: 两个拍排好序的数组,a, b 问你第k小的两个数组的元素乘积是多大。 题解: 两个数组的元素乘积最小是-105 * 105 最大是105 * 105 我们可以在这个范围内做二分,那么问题的关键就是能不能给你一个数,让你找到有多少个元素乘积小于这个数,复杂度最多n*log(n) 其实可以2022-01-14T12:02:00Z2022-01-14T12:02:00ZShendu.CChttps://www.cnblogs.com/dacc123/【摘要】题目 题意: 两个拍排好序的数组,a, b 问你第k小的两个数组的元素乘积是多大。 题解: 两个数组的元素乘积最小是-105 * 105 最大是105 * 105 我们可以在这个范围内做二分,那么问题的关键就是能不能给你一个数,让你找到有多少个元素乘积小于这个数,复杂度最多n*log(n) 其实可以 <a href="https://www.cnblogs.com/dacc123/p/15803370.html" target="_blank">阅读全文</a>https://www.cnblogs.com/dacc123/p/15356635.htmlLeetCode 1931. Painting a Grid With Three Different Colors(DP) - Shendu.CC题目 题解,动态规划 因为m 最大只有5,所以我们可以枚举5个相邻的块,最多有多少种可能, 然后分析每个是否能与其他几个并排,然后就是简单的BP了 class Solution { public: int dp[50][5]; int bp[5]; int num[50]; long long in2021-09-30T06:27:00Z2021-09-30T06:27:00ZShendu.CChttps://www.cnblogs.com/dacc123/【摘要】题目 题解,动态规划 因为m 最大只有5,所以我们可以枚举5个相邻的块,最多有多少种可能, 然后分析每个是否能与其他几个并排,然后就是简单的BP了 class Solution { public: int dp[50][5]; int bp[5]; int num[50]; long long in <a href="https://www.cnblogs.com/dacc123/p/15356635.html" target="_blank">阅读全文</a>https://www.cnblogs.com/dacc123/p/14905227.htmlLeetCode 1803. Count Pairs With XOR in a Range (二叉树) - Shendu.CC题目 在一个数组里面找到两个数异或的结果在某个范围之内。 这种题目,就要用二叉树, 代码写的又臭又长。。 struct Node { int value; int left; int right; int num; int pos; }tree[200005]; class Solution { p2021-06-19T14:37:00Z2021-06-19T14:37:00ZShendu.CChttps://www.cnblogs.com/dacc123/【摘要】题目 在一个数组里面找到两个数异或的结果在某个范围之内。 这种题目,就要用二叉树, 代码写的又臭又长。。 struct Node { int value; int left; int right; int num; int pos; }tree[200005]; class Solution { p <a href="https://www.cnblogs.com/dacc123/p/14905227.html" target="_blank">阅读全文</a>https://www.cnblogs.com/dacc123/p/14737786.htmlLeetCode 357. Count Numbers with Unique Digits - Shendu.CC题目 毫无意义的题目。 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); } re2021-05-07T01:34:00Z2021-05-07T01:34:00ZShendu.CChttps://www.cnblogs.com/dacc123/【摘要】题目 毫无意义的题目。 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 <a href="https://www.cnblogs.com/dacc123/p/14737786.html" target="_blank">阅读全文</a>https://www.cnblogs.com/dacc123/p/14586916.htmlLeetCode 1766. Tree of Coprimes - Shendu.CC题目 题意: 对于树上的每个节点,找出与它的值互质的最近的祖先节点。 题解: 由于节点上的值在1-50之间,所以算互质很好算,事先算法。然后就是深度优先遍历树的时候维护路径上的节点的位置,利用1-50这个小范围,快速找到与当前节点值互质的值出现在哪些位置上 struct Node { int val2021-03-27T12:49:00Z2021-03-27T12:49:00ZShendu.CChttps://www.cnblogs.com/dacc123/【摘要】题目 题意: 对于树上的每个节点,找出与它的值互质的最近的祖先节点。 题解: 由于节点上的值在1-50之间,所以算互质很好算,事先算法。然后就是深度优先遍历树的时候维护路径上的节点的位置,利用1-50这个小范围,快速找到与当前节点值互质的值出现在哪些位置上 struct Node { int val <a href="https://www.cnblogs.com/dacc123/p/14586916.html" target="_blank">阅读全文</a>https://www.cnblogs.com/dacc123/p/14423022.htmlLeetCode 1739. Building Boxes - Shendu.CChttps://leetcode.com/problems/building-boxes/ 题意:在一个边长是n的立方体中放n个方块,方块可以叠加,但是被叠加的在下方的方块八面必须挨着墙或者别的方块。 问最底部最少可以放多少个方块。 这是一道找规律的题目,我们可以找出底部方块的个数m和最多可以放n个2021-02-20T11:55:00Z2021-02-20T11:55:00ZShendu.CChttps://www.cnblogs.com/dacc123/【摘要】https://leetcode.com/problems/building-boxes/ 题意:在一个边长是n的立方体中放n个方块,方块可以叠加,但是被叠加的在下方的方块八面必须挨着墙或者别的方块。 问最底部最少可以放多少个方块。 这是一道找规律的题目,我们可以找出底部方块的个数m和最多可以放n个 <a href="https://www.cnblogs.com/dacc123/p/14423022.html" target="_blank">阅读全文</a>https://www.cnblogs.com/dacc123/p/14403465.html1745. Palindrome Partitioning IV (回文树) - Shendu.CC题目 题意:判断一个字符串是否可以由三个回文串组成 题解:利用强大的回文树,计算出以每个字符为结尾的回文串,然后从字符串的最后一个字符开始,递归判断。 struct Tree { int next[4005][30]; int fail[4005]; int cnt[4005]; int num[42021-02-15T03:53:00Z2021-02-15T03:53:00ZShendu.CChttps://www.cnblogs.com/dacc123/【摘要】题目 题意:判断一个字符串是否可以由三个回文串组成 题解:利用强大的回文树,计算出以每个字符为结尾的回文串,然后从字符串的最后一个字符开始,递归判断。 struct Tree { int next[4005][30]; int fail[4005]; int cnt[4005]; int num[4 <a href="https://www.cnblogs.com/dacc123/p/14403465.html" target="_blank">阅读全文</a>https://www.cnblogs.com/dacc123/p/14400440.html1755. Closest Subsequence Sum - Shendu.CC题目 题意:从一个数组找出一个子集,使得子集的和给定的目标最相近。 题解:数组的长度为40,找出全部子集一共有240种可能性,如果把一个数组平均分成两部分,分别算出两部分的所有子集和,每部分有220种可能, 然后再二分查找答案。 遇到这种在数组里找所有子集和, class Solution { pu2021-02-13T09:42:00Z2021-02-13T09:42:00ZShendu.CChttps://www.cnblogs.com/dacc123/【摘要】题目 题意:从一个数组找出一个子集,使得子集的和给定的目标最相近。 题解:数组的长度为40,找出全部子集一共有240种可能性,如果把一个数组平均分成两部分,分别算出两部分的所有子集和,每部分有220种可能, 然后再二分查找答案。 遇到这种在数组里找所有子集和, class Solution { pu <a href="https://www.cnblogs.com/dacc123/p/14400440.html" target="_blank">阅读全文</a>https://www.cnblogs.com/dacc123/p/14358725.htmlLeetCode 1723. Find Minimum Time to Finish All Jobs - Shendu.CC题目 题意:将n个数分成k组,使得k组中的最大值最小。 题解:暴力DFS,但是要注意两个地方剪枝,首先在DFS的过程中判断当前的最大值是不是已经超过了已有答案。 第二个剪枝的地方比较triky,由于我们对k组没有顺序要求的,所以当剩下的组都是空的时候,我们只需要DFS第一个组。 class Solu2021-02-01T12:04:00Z2021-02-01T12:04:00ZShendu.CChttps://www.cnblogs.com/dacc123/【摘要】题目 题意:将n个数分成k组,使得k组中的最大值最小。 题解:暴力DFS,但是要注意两个地方剪枝,首先在DFS的过程中判断当前的最大值是不是已经超过了已有答案。 第二个剪枝的地方比较triky,由于我们对k组没有顺序要求的,所以当剩下的组都是空的时候,我们只需要DFS第一个组。 class Solu <a href="https://www.cnblogs.com/dacc123/p/14358725.html" target="_blank">阅读全文</a>https://www.cnblogs.com/dacc123/p/14212673.htmlLeetCode 1632. Rank Transform of a Matrix - Shendu.CC题目 拖了两个月,终于这这道题目AC了。 思路是贪心,将所有的元素从小到大排序。并且维护两个数组,一个数组代表每一行的当前已经填上的最大的rank,比如nrank[0]=2 表示第0行,目前已经填到了rank=2,下一个再填就一定是>=2的数字。 同理列也是。一开始nrank[],和mrank[]都2020-12-30T09:45:00Z2020-12-30T09:45:00ZShendu.CChttps://www.cnblogs.com/dacc123/【摘要】题目 拖了两个月,终于这这道题目AC了。 思路是贪心,将所有的元素从小到大排序。并且维护两个数组,一个数组代表每一行的当前已经填上的最大的rank,比如nrank[0]=2 表示第0行,目前已经填到了rank=2,下一个再填就一定是>=2的数字。 同理列也是。一开始nrank[],和mrank[]都 <a href="https://www.cnblogs.com/dacc123/p/14212673.html" target="_blank">阅读全文</a>https://www.cnblogs.com/dacc123/p/13856962.htmlLeetCode 1595 Minimum Cost to Connect Two Groups of Points (动态规划) - Shendu.CC题目 题解: 动态规划,用二进制压缩状态,注意分析几种情况,就能推出来正确的状态转移方程。 class Solution { public: int dp[12][4096]; int connectTwoGroups(vector<vector<int>>& cost) { int n = cos2020-10-22T03:00:00Z2020-10-22T03:00:00ZShendu.CChttps://www.cnblogs.com/dacc123/【摘要】题目 题解: 动态规划,用二进制压缩状态,注意分析几种情况,就能推出来正确的状态转移方程。 class Solution { public: int dp[12][4096]; int connectTwoGroups(vector<vector<int>>& cost) { int n = cos <a href="https://www.cnblogs.com/dacc123/p/13856962.html" target="_blank">阅读全文</a>https://www.cnblogs.com/dacc123/p/13704937.htmlLeetCode 1585 Check If String Is Transformable With Substring Sort Operations - Shendu.CC题目 题意:一个只有0-9组成的字符串,每次选择任意一个子串,按照数字从小到大排序。问从源字符串能否经过若干次操作转换成目标字符串。 题解:首先题目只问了是否,而没有问多少次,所以可以判断出,我们不关心过程是怎么样的,只关心结果能否到达。所以不太可能是动态规划,搜索什么的。 既然是看结果,那估计是个2020-09-21T04:57:00Z2020-09-21T04:57:00ZShendu.CChttps://www.cnblogs.com/dacc123/【摘要】题目 题意:一个只有0-9组成的字符串,每次选择任意一个子串,按照数字从小到大排序。问从源字符串能否经过若干次操作转换成目标字符串。 题解:首先题目只问了是否,而没有问多少次,所以可以判断出,我们不关心过程是怎么样的,只关心结果能否到达。所以不太可能是动态规划,搜索什么的。 既然是看结果,那估计是个 <a href="https://www.cnblogs.com/dacc123/p/13704937.html" target="_blank">阅读全文</a>https://www.cnblogs.com/dacc123/p/13680057.htmlLeetCode 1553. Minimum Number of Days to Eat N Oranges - Shendu.CC题目 题意:一堆橘子,要么吃一个,如果橘子数量能被2整除就可以吃一半,如果橘子数量能被3整除就可以吃三分之二,请问最少几次能吃完? 题解:橘子的个数是n,按照贪心的思想,肯定是吃一半或者吃三分之二划算。因此每一步,都有两种选择,要么一个一给吃,吃到能被2整除,然后吃掉一半。要么一个一个吃,吃到能被32020-09-16T08:55:00Z2020-09-16T08:55:00ZShendu.CChttps://www.cnblogs.com/dacc123/【摘要】题目 题意:一堆橘子,要么吃一个,如果橘子数量能被2整除就可以吃一半,如果橘子数量能被3整除就可以吃三分之二,请问最少几次能吃完? 题解:橘子的个数是n,按照贪心的思想,肯定是吃一半或者吃三分之二划算。因此每一步,都有两种选择,要么一个一给吃,吃到能被2整除,然后吃掉一半。要么一个一个吃,吃到能被3 <a href="https://www.cnblogs.com/dacc123/p/13680057.html" target="_blank">阅读全文</a>https://www.cnblogs.com/dacc123/p/13523976.htmlLeetCode 1547. Minimum Cost to Cut a Stick(动态规划) - Shendu.CC题目 区间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 Solut2020-08-18T07:52:00Z2020-08-18T07:52:00ZShendu.CChttps://www.cnblogs.com/dacc123/【摘要】题目 区间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 <a href="https://www.cnblogs.com/dacc123/p/13523976.html" target="_blank">阅读全文</a>https://www.cnblogs.com/dacc123/p/13497345.htmlLeetCode 1546. Maximum Number of Non-Overlapping Subarrays With Sum Equals Target(动态规划) - Shendu.CC题目 题意:在一个数组中,找到最多的不相交的子序列,每个子序列的和等于target。 题解:动态规划 dp[i]表示从0到i的子数组的答案。维护前缀数组sums[],我们维护一个记录前缀和的map,map[x]表示前缀和是x距离当前i最近的下标。 那么状态转移方程就是dp[i] = max(dp[i2020-08-13T08:51:00Z2020-08-13T08:51:00ZShendu.CChttps://www.cnblogs.com/dacc123/【摘要】题目 题意:在一个数组中,找到最多的不相交的子序列,每个子序列的和等于target。 题解:动态规划 dp[i]表示从0到i的子数组的答案。维护前缀数组sums[],我们维护一个记录前缀和的map,map[x]表示前缀和是x距离当前i最近的下标。 那么状态转移方程就是dp[i] = max(dp[i <a href="https://www.cnblogs.com/dacc123/p/13497345.html" target="_blank">阅读全文</a>https://www.cnblogs.com/dacc123/p/13460203.htmlLeetCode 354 Russian Doll Envelopes (动态规划) - Shendu.CC题目 一道好题目,把最长递增子序列扩展到二维,但是这道题和最长递增子序列是有区别的,它不要求是序列,只是在数组中找到一组最长的组合,不要求顺序在初始中相同。 这是个二维的最长递增子序列,由于没有顺序限制,所以我们把第一维进行排序,然后对第二维进行动态规划 接下来就和最长递增子序列的思路一样: 效率是2020-08-08T12:37:00Z2020-08-08T12:37:00ZShendu.CChttps://www.cnblogs.com/dacc123/【摘要】题目 一道好题目,把最长递增子序列扩展到二维,但是这道题和最长递增子序列是有区别的,它不要求是序列,只是在数组中找到一组最长的组合,不要求顺序在初始中相同。 这是个二维的最长递增子序列,由于没有顺序限制,所以我们把第一维进行排序,然后对第二维进行动态规划 接下来就和最长递增子序列的思路一样: 效率是 <a href="https://www.cnblogs.com/dacc123/p/13460203.html" target="_blank">阅读全文</a>