- 博客(1278)
- 收藏
- 关注
原创 【LeetCode - 1235. hard】规划兼职工作
那道题直接贪心即可(其中又分两种思路,右端点贪心,能选则选。左端点贪心,能选择试图选,有更优则取更优)官方题解是dp+二分,我这种写法是离散化+枚举dp,我的代码复杂度更高一些,可以直接看官网做法。如果限定这道题的报酬都是1,那么就转化成【最大不相交区间数】了。n个区间,求最大的不相交区间数。这道题带权值了,所以加个dp。
2022-11-03 02:33:40 454 1
原创 【LeetCode】面试题 17.19. 消失的两个数字
法二:给原数组加上1~N这N个数,变为“给定一个数组,其中只有两个数出现了一次,其他数都出现了两次,求这两个数”的题目,然后老套路了。法一:假设两个数分别是a和b,那么不难求出a+b和a^2+b^2,然后求解二次方程就可以了。
2022-11-02 15:19:09 982
原创 【LeetCode-6223 hard】317场周赛. 移除子树后的二叉树高度
我做麻烦了 ,其实两遍dfs就可以了,第一遍算高度,第二遍算深度,并且在第二次dfs的时候可以直接维护出答案数组:ans[i]代表删掉i为根节点的子树后树的高度。其实主要的思想就是子树问题可以简化成根节点的问题,即把整个子树的信息都汇聚到根节点上,然后把这个信息作为参数延续在dfs中传递就可以了。我的做法比较麻烦,首先基于一个结论:同层删除一个节点之后,答案肯定在同层的其他节点身上。如果该层之后这一个节点,那答案肯定在父节点身上。
2022-11-02 15:18:40 392
原创 【LeetCode-940 hard】不同的子序列 II
dp之后考虑去重(或者直接再用一个数组cnted[26]表示'a'~'z'字符结尾的子序列已经有多少个了)然后直接作差就可以,因为不难证明,cnted[s[i]-'a']统计的,是dp[i]的真子集,所以所有s[i]结尾的都可以减去。dp[i]代表以s[i]结尾的子序列数量。然后再加一层循环枚举倒数第二个字符。
2022-11-02 15:00:43 162
原创 【LeetCode 904-medium】水果成篮
力扣题我的AC代码:(法1:边遍历边维护答案,如果遇到f[i]是第三个数就抛弃 除了f[i-1]的另一个数)指定左端点i,二分右端点j,看最大值和最小值是否是f[i]和f[i+1]。复杂度O(nlogn)这题做法多种多样,看能不能找到五种做法。用哈希表维护(或者map)思路3:(法3:区间最大值和区间最小值)思路2:(法2:尺取法)
2022-10-19 00:59:02 231
原创 【LeetCode2434. medium】使用机器人打印字典序最小的字符串
1、①那里,没必要,因为他可以和第二种方法合并,没必要先处理当前字符,然后再进流程。本来想着是,先往前看相邻的(输出,必须是连续的c字符),然后往后看(只输出c字符,一直到后面没有c字符),然后再往前看(栈内的全都输出,一直到输出完c字符)因为你看题目说有两种操作,但是却不问最少的操作数,说明说不定这两种操作可以合并或者转换,与两种操作无关。本来想的是,从字符a-z进行遍历,先处理a在处理b这样,但是好像处理不了bdacb这种情况。然后发现没这么复杂,从栈的角度考虑贪心,啥时候入栈,啥时候输出,就行了。
2022-10-16 20:55:05 302
原创 【LeetCode856. medium】括号的分数
比如第三层的括号之间就是相加,第二层的括号就是把第三层的分数和乘2。记得算完第二层的分之后,要把第三层的清零,因为后面还有可能出现第三层。二是预处理一下字符串,比如最内层的中间给加个特殊字符&,然后如果遍历到&,就cnt[sk.size()]=1就可以了。至于最里层的括号,发现只有最内层的括号会有这个问题(需要赋初值为1,而不是向高层乘2)。本来是想用栈做,但是发现其实得分是相加还是乘2,和括号的层级有关系。总体看下来,栈其实就只充当一个记录层数的作用了,完全可以用变量代替。
2022-10-16 20:54:13 166
原创 【LeetCode-769. medium】最多能完成排序的块
考虑到数组长度为n,而且数组元素位于区间[0, n-1]且不重复,那么数组排好序后,每个值和下标恰好是相等的;所以,从左到右遍历数组,并且分别对值和下标累加求和,只要两个和相等,就切出一个块。(思路是a==c, a+b==c+d,则b=d,类似糖水不等式那种,初量和全量相等,则增量相等)(注意是初始化,最好不要直接用下一个的值,具体见代码标注)2.2 如果符合分割条件,则分割。如此,时间复杂度O(n),空间复杂度O(1)。2、for循环或者while,里面三步。
2022-10-13 02:16:42 132
原创 【14周-星耀】节约用电 (洛谷P1220 关路灯)
这题dp定义状态的时候要注意,dp[i][j]考虑的不是[i][j]的消耗量,而是整个区间的消耗量的最小值。1、如何想到第三维度的状态设计?2、最优子问题并不是要局限于仅仅在那一部分操作,是可以包含那一部分对全局的影响的,只要最后的答案是对的,状态设计确实是可以有很多种。ps:如果我就dp[i][j]代表把[i,j]都关掉,[i,j]这边消耗的电量和,应该也是可以的,因为其实不会有交叉影响?状态定义:dp[i][j][2]代表 把[i,j]的等刚好关完的那一刻,并且人站在左/右端点时,耗电的最小值。
2022-10-12 01:49:59 332
原创 【洛谷 P2034】选择数字(单调队列优化dp)
因为本题需要在每隔最多k个数字就要放弃一个,所以对于每一个数字i,向它后面的i+1~i+k+1连边,之后设一个超级起点s连向1~k,再将n-k+1~n的节点连向一个超级终点t,之后以s为起点跑最短路,所有阶段权值的总和sum减去s到t的距离就是最后的答案。由于需要连得边数是O(nk)级别的,并且是一个点向一个区间的点连一条边,因此可以用线段树优化建图,讲连的边数变成O(nlogk),总的时间复杂度是O(nlognlogn)思路4:(正难则反,本质还是单调队列)思路2:(和思路1一样)
2022-10-09 22:54:13 439
原创 【LeetCode-6195. hard】对字母串可执行的最大删除数
正着想是,dp[i]代表前i个能消除的最大次数,枚举最后一次消除次数,反着想,就是dp[i]代表从i到结尾都消除的最大次数,然后枚举第一次消除的字符串。然后一想,诶,这就是可解的了。二是因为dp[i]代表前i个的最大次数,这其实不只要保存最大次数这一个状态,还有可能很多局部最优解需要保存。倒着推,结合这题的题意,正好。刚开始觉得直接贪心选有短则短,但是发现不行,不能贪心有短的可以操作的则选短的。然后就是对于如何判断两个字符串的相等,可以字符串哈希,也可以用求LCP的板子。错误代码:(从前往后递推的)
2022-10-09 22:50:14 179
原创 【19周-星耀】FASTER!FASTER!FASTER!
然后感觉欸,我是不是可以,还是【dp[i][j]代表跑到第i个,并且拆了j个牌子的最短时间】,这样定义状态,但是转移的时候再加一个遍历,从前面找到用时最少的转移过来,但是还是不对啊,局部最优解不代表全局最优解啊,这个速度不一定是全局最优解的速度啊。所以老老实实三维dp,dp[i][j][s]代表跑到第i个位置,拆了j个,并且到位置i时的速度是a[s],的最小时间花费。但是G了,因为无法根据定义的状态判断从[i]到[i+1]的速度是多少。2、注意这题初始化需要初始化dp[1]和dp[2],然后从3开始递推。
2022-10-09 22:49:20 173
原创 【LeetCode-2421(hard)】好路径的数目
启发式合并,注意这题的【特性】在于,对于每个根节点,要把小于根节点的val都删掉,保证一条链上是中间小两边大。因为这样递归上去,刚好可以保证链上的每个非端点都小于端点的值)1、【由特解到通解】先面向数据编程,想人脑想的话,会怎么做?那肯定是先找最大的值,然后看有几个,然后把最大的值去掉看次大的,以此类推。3、树分治(点分治,但是校招应该不会问到这个难度吧,,不复习了就)对于这道题,可以把这种大小关系想成一种偏序关系,然后自然想到可以通过排序解决。2、解决树类问题的一种思路就是,重建树+在线维护,比如这题。
2022-09-30 15:07:59 530
原创 【18周-钻石】能量供应
总纲是贪心,按终点排序,然后优先往右边排能量塔。具体实现的时候需要单点更新,区间查询,所以用树状数组+set维护一下,就OK了。代码:(不知道为啥有一个样例RE了)
2022-09-30 15:07:14 165
原创 【Codeforce-911D】逆序对
因此这题作为奇偶性,其实只需要关注该翻转区间的【倒序排列的逆序对】就可以了,关于【倒序排列的逆序对】,可以直接用求和公式去算,也可以找到规律,随着翻转区间的长度的增长,奇偶性分别为【奇奇偶偶奇奇偶偶奇奇偶偶】以此类推,所以其实只需要看【区间长度/2】的奇偶就可以了。不难发现,假设n的倒序排列(n,n-1,...,3,2,1)的逆序对是x,则对n的任意一个逆序对数为y的排列做翻转,新生成的排列的逆序对数位x-y。
2022-09-08 00:26:41 177
原创 【20220903-美团笔试】
这两种方法各有好处,第一种的好处在于,可以直接if(c[i]==j),然后dp[i][]用dp[i-1][]转移过来,好处二是,因为题目给的就是初始所在城市,也就是dp[0][]当做初始化。如果用第二种方法,那最好是用dp[i]更新dp[i+1]的方式。t2= max(dp[i-1][1], dp[i-1][2], ...不包含dp[i-1][c[i]]..., dp[i-1][n]) + b[i] # 完成任务。dp[i][j] = dp[i-1][j] + a[i] # 完成任务。时间复杂度O(n)。
2022-09-07 19:39:10 1370
原创 【算法练习题】位运算(贪心)
基于以上两点(对于这一题,主要是第二点),我们可以简单的进行扩展这个结论,对于任意出现过的某个数位的1,都可以进行任意的排列组合。因为我们发现,对于平方和,数字集中在越少的个数上,值越大,比如(4+1)^2>4^2+1^2,以此类推,所以贪心的策略显而易见。(没有证明,猜的一个结论)1、对于两个数a,b ,生成a&b和a|b,则一定对应一个常数c,使得生成的两个数分别是a+c和a-c。2、对于两个数a,b,生成a&b和a|b的前后,二进制的1的个数是不变的。
2022-09-05 00:06:56 165
原创 2022-08-21 星环科技-C++开发笔试
但其实对于这种情况,他是要输出0的,而不是9,所以他不是一个图论问题,他带有顺序性,这种可以用dp来维护。注意更新的时候必须第一维的所有节点都要更新,因为都算是有用状态!别只更新dp[c][c]了。dp[i][j],代表i王朝并且以j字符结尾的最大长度。本来以为他是一个图论问题,找最大环。思路:拓扑排序,不解释了。
2022-08-24 17:59:12 629
原创 2022-08-20-网易笔试题
题目收集来源自网络,前四题是开发岗的,后四题是算法岗的,因为代码无处提交,不一定正确,就不贴出来了,这里只写一下我的思路吧~欢迎大家一起讨论~~1、思路:因为最大1e9,也就是最多10位数字。且操作只跟结果有关,跟过程无关,因此可以对a和b分别二进制枚举删除的数字,这样a有2^10个可能性,b有2^10个可能性,然后暴力取操作次数的min就可以了。时间复杂度O(2^10^2),正常写的话可能带个log,但是不难通过一些方法优化掉。2、
2022-08-24 01:46:51 2637
原创 【Leetcode - 172】阶乘后的零(思维)
给定一个整数 n ,返回 n! 结果中尾随零的数量。提示 n! = n * (n - 1) * (n - 2) * ... * 3 * 2 * 1示例 1:输入:n = 3输出:0解释:3! = 6 ,不含尾随 0示例 2:输入:n = 5输出:1解释:5! = 120 ,有一个尾随 0示例 3:输入:n = 0输出:0提示:0 <= n <= 104进阶:你可以设计并实现对数时间复杂度的算法来解决此问题吗?来源:力扣(LeetCod..
2022-03-30 13:29:28 180
原创 【LeetCode - 2049】统计最高分的节点数目
解题报告;直接dp。注意mx也得longlongAC代码:class Solution {public: vector<int> vv[200005]; int sum[200005]; long long ans[200005]; int n; void dfs(int x) { ans[x] = 1; sum[x] = 1; for(int i = 0; i<vv[x].size();...
2022-03-12 13:39:36 225
原创 【LeetCode - 798】得分最高的最小轮调(转化法)
解题报告:思路一:这题首先说一个nlogn的方法。首先一个主客转化,题目描述是说把数组做翻转,idx不变,然后nums[i]和i作比较。那么我们可以转化为让数组不变,idx转变,即:假设刚开始i=4,那么idx的变化为[4,3,2,1,0,n-1,...,5],再用nums[i] - idx,如果这个值>0,则是符合区间的k。具体来说,比如nums = [ 2, 3, 1, 4, 0],对应的idxidx = [ 0, 1, 2, 3, 4],作差后diff = [-2,...
2022-03-11 23:46:08 205
原创 【LeetCode - 443】压缩字符串(模拟)
解题报告:直接模拟。class Solution {public: int compress(vector<char>& chars) { int p = 0; for(int i = 0; i<chars.size();) { int j = i+1; while(j<chars.size() && chars[j] == chars[i]) j...
2022-03-10 20:02:04 155
原创 【LeetCode - 32】最长有效括号
给你一个只包含 '(' 和 ')' 的字符串,找出最长有效(格式正确且连续)括号子串的长度。示例 1:输入:s = "(()"输出:2解释:最长有效括号子串是 "()"示例 2:输入:s = ")()())"输出:4解释:最长有效括号子串是 "()()"示例 3:输入:s = ""输出:0提示:0 <= s.length <= 3 * 104s[i] 为 '(' 或 ')'来源:力扣(LeetCode)链接:https://leetcode-.
2022-03-07 13:05:22 560 1
原创 【LeetCode - 1765】. 地图中的最高点
力扣解题报告:多元BFS。进阶一下:二维数组,1表示等高线,0表示平地,比如输入010111010输出010121010输入010101010输出010111010即输入一个二维地图,保证等高线一定是闭合的环,最外圈保证一定是0,求每个点的真实高度。class Solution {public: vector<vector<int>> highestPeak(vector<vector<in.
2022-03-07 01:15:07 158
原创 【LeetCode - 33】搜索旋转排序数组(二分)
力扣解题报告:二分。但是有不少细节要考虑清楚。所以干脆考虑另一种二分的方式。也就是第二次二分的时候,把两半数组给拼成一个完整的数组,当然下标需要是虚拟的,这一步可以用偏移量+取模完成。这样就不需要考虑边界情况了。class Solution {public: int search(vector<int>& nums, int target) { int n = nums.size(); int l = 0, r = n.
2022-03-07 01:10:54 108
原创 【LeetCode】第283场周赛题解
给你一个整数数组 nums 和一个整数 k 。请你向 nums 中追加 k 个 未 出现在 nums 中的、互不相同 的 正 整数,并使结果数组的元素和 最小 。返回追加到 nums 中的 k 个整数之和。示例 1:输入:nums = [1,4,25,10,25], k = 2输出:5解释:在该解法中,向数组中追加的两个互不相同且未出现的正整数是 2 和 3 。nums 最终元素和为 1 + 4 + 25 + 10 + 25 + 2 + 3 = 70 ,这是所有情况中的最小值。所以追
2022-03-07 01:04:42 303
原创 【LeetCode - 42. 接雨水】
42. 接雨水难度困难3164给定n个非负整数表示每个宽度为1的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。示例 1:输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]输出:6解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 示例 2:输入:height = [4,2,0,3,2,5]输出:9提示:n == h...
2022-03-01 23:37:20 111
原创 【NC54 三数之和】(待整理)
描述给出一个有n个元素的数组S,S中是否有元素a,b,c满足a+b+c=0?找出数组S中所有满足条件的三元组。数据范围:0 \le n \le 10000≤n≤1000,数组中各个元素值满足|val | \le 100∣val∣≤100空间复杂度:O(n^2)O(n2),时间复杂度O(n^2)O(n2)注意:三元组(a、b、c)中的元素必须按非降序排列。(即a≤b≤c) 解集中不能包含重复的三元组。例如,给定的数组 S = {-10 0 10 20 -10 -40},解..
2022-03-01 21:41:36 174
原创 【NC51 合并k个已排序的链表】K路归并
描述合并 k个升序的链表并将结果作为一个升序的链表返回其头节点。数据范围:节点总数0 \le n \le 50000≤n≤5000,每个节点的val满足|val| <= 1000∣val∣<=1000要求:时间复杂度O(nlogn)O(nlogn)示例1输入:[{1,2,3},{4,5,6,7}]返回值:{1,2,3,4,5,6,7}示例2输入:[{1,2},{1,4,5},{6}]返回值:{1,1,2,4,5,6}...
2022-03-01 21:34:43 590
原创 【NC14 按之字形顺序打印二叉树】
描述给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替)数据范围:0 \le n \le 15000≤n≤1500,树上每个节点的val满足|val| <= 100∣val∣<=100要求:空间复杂度:O(n)O(n),时间复杂度:O(n)O(n)例如:给定的二叉树是{1,2,3,#,#,4,5}该二叉树之字形层序遍历的结果是[[1],[3,2],[4,5]]示例1输入:{1,2,3,#,.
2022-03-01 18:31:18 108
原创 【LCS系列】最长公共子序列和最长公共子串
最长公共子序列:如果要回溯出整个字符串的答案的话,可以直接看dp[i][len2-1]列,或者dp[len1-1][i]这一行,变化的时候,则代表要选这个字符,然后连起来就可以了。(即构造字符串的过程是On的)class Solution {public: /** * longest common substring * @param str1 string字符串 the string * @param str2 string字符串 the string.
2022-03-01 16:08:45 127
原创 【NC140 排序】手写快速排序
描述给定一个长度为 n 的数组,请你编写一个函数,返回该数组按升序排序后的结果。数据范围:0 \le n \le 1\times10^30≤n≤1×103,数组中每个元素都满足0 \le val \le 10^90≤val≤109要求:时间复杂度O(n^2)O(n2),空间复杂度O(n)O(n)进阶:时间复杂度O(nlogn)O(nlogn),空间复杂度O(n)O(n)注:本题数据范围允许绝大部分排序算法,请尝试多种排序算法的实现。示例1输入:[5,2,...
2022-03-01 16:07:09 224
原创 【NC30】缺失的第一个正整数
描述给定一个无重复元素的整数数组nums,请你找出其中没有出现的最小的正整数进阶: 空间复杂度 O(1),时间复杂度 O(n)数据范围:-2^31<=nums[i]<=2^31-10<=len(nums)<=5*10^5示例1输入:[1,0,2]复制返回值:3复制示例2输入:[-2,3,4,1,5]复制返回值:2复制示例3输入:[4,5,6,8,9]复制返回值:1解题报告:
2022-02-22 00:34:58 690
原创 【LeetCode 629】K个逆序对数组
给出两个整数n和k,找出所有包含从1到n的数字,且恰好拥有k个逆序对的不同的数组的个数。逆序对的定义如下:对于数组的第i个和第j个元素,如果满i<j且a[i]>a[j],则其为一个逆序对;否则不是。由于答案可能很大,只需要返回 答案 mod 109+ 7 的值。示例 1:输入: n = 3, k = 0输出: 1解释:只有数组 [1,2,3] 包含了从1到3的整数并且正好拥有 0 个逆序对。示例 2:输入: n = 3, k = 1...
2022-02-17 22:19:25 472
原创 【LeetCode 2】两数相加(链表)
给你两个非空 的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0开头。示例 1:输入:l1 = [2,4,3], l2 = [5,6,4]输出:[7,0,8]解释:342 + 465 = 807.示例 2:输入:l1 = [0], l2 = [0]输出:[0]示例 3:输入:l1 = [9,9,9,9,9,9,...
2022-02-17 19:25:51 109
原创 【搬石头排序】
据说是2020浪潮笔试时间限制:C / C + +语言1000MS;其他语言3000MS内存限制:C / C + +语言131072KB;其他语言655360KB题目描述:沙滩按照线型摆放着n个大小不一的球形石头,已知第i个石头的半径为ri,且不存在两个石头有相同的半径。为了使石头的摆放更加美观,现要求摆放的石头的半径从左往右依次递增。因此,需要对一些石头进行移动,每次操作可以选择一个石头,并把它放在剩下n−1个石头在最左边或最右边。问最少需要操作多少次才能将这n个石头的半径变
2022-02-16 01:55:58 209
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人