![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
每日一题
Kayle77
这个作者很懒,什么都没留下…
展开
-
2023.7.8每日一题
因为此题是有序数组,所以可以使用双指针O(n)过,维护两端的双指针,如果总和大于target,右指针左移;小于target左指针右移即可。原创 2023-07-08 18:08:34 · 62 阅读 · 0 评论 -
2023.7.6每日一题
要求我们把数字拆分成若干个正偶数,且拆分出的数目最多,我们可以从2,4,6开始拆,沿正偶数递增拆,可以保证拆得数目最多,在每拆出一个偶数时,将总数减去它,直到当前数字小于当前所剩最小偶数+当前最小偶数加2就拆不出来了。因为我们从小到大拆的偶数,题目要求是互不相同,记当前所剩最小偶数为i,当前所剩数字为x。如果不能拆相同的数字,就要保证当前数字能拆成i和i+2,所以只要满足x=i+i+2,就可以继续拆。另外如果当前数字是奇数,必不可能全拆成偶数,直接返回即可,否则必能全部拆成偶数相加。原创 2023-07-08 15:51:23 · 59 阅读 · 0 评论 -
2023.7.5每日一题
可以看出我们是将每个区间的start按照升序在数轴上画出来的,如果此区间的start比上一个区间的end小,即可合并,在合并时start不动,end变成此区间的end和上一个区间的end的最大值(因为会出现此区间被包含于上一个区间包含的情况)。(可以证明一下正确性,我不会证明hhh)ans的最后一行的end=max(ans最后一行的end,当前end)第一步排序还是比较好想的,比较麻烦的就是第二步合并的步骤,还是要多想一下的。先思考一下如果给我们一串终点和起点,如何手算出来。将此区间pushback即可。原创 2023-07-05 01:06:43 · 55 阅读 · 0 评论 -
2023.7.4每日一题
先对每行排序,再将每行的所有列取最大值,一直加到ans里就行。原创 2023-07-04 23:54:44 · 33 阅读 · 0 评论 -
2023.7.1每日一题
遍历O(n^2)能过,但可以O(n)过, 维护一个map,如果当前map中没有当前数字,就将target-当前数字和下标存入map中,否则返回当前数字下标和target-当前数字的下标。原创 2023-07-04 23:49:29 · 42 阅读 · 0 评论 -
2023.6.30每日一题
【代码】2023.6.30每日一题。原创 2023-07-04 23:45:09 · 211 阅读 · 0 评论 -
2023.6.29每日一题
先处理第一行,先把有2所在的列填上1,如果不够再在任意不为1的位置补1,直到1的个数和upper相等即可。在每次填1的时候记得colsum--。因为第一行每次填完后colsum--,现在只需要在colsum=1的列填1即可。满足这三个条件即可重构此矩阵,但是题目要求输出满足的矩阵,现在就要考虑怎么处理1的位置合理。因为只有2行,所有如果列中有2,那两行中必须都出现1才能凑2。2.colsum中2的个数小于等于upper。在2行n列的矩阵中,所有行相加=所有列相加。原创 2023-07-04 23:15:55 · 26 阅读 · 0 评论 -
2023.6.26每日一题
当r==k,自然成立,每次都取不同的指数。r>k,无论怎么取,都不可能有r个1。r<k,两个1可以进位为一个1,所以当k>r时,也成立。此时题中有num2,我们不妨从小到大枚举次数k,一次将所有次数的num2减去,再计算1的个数。假设此题没有num2的影响,那么就可以计算num1二进制的1的个数,就是要操作的次数。综上从小到大枚举答案,如果满足t>k且k>=r则k次操作就可以达到。t<k:即使每次取最小2的0次方,k个1加起来都大于t,无解。此时再计算t中二进制1的个数,记为r。t<0:则不可能有解。原创 2023-06-26 22:59:48 · 44 阅读 · 0 评论 -
2023.6.25每日一题
观察公式可得出,要想使d最小,只需找出最小的(x-x0)和(y-y0)。判断矩形是否和圆有公共点,只需判断矩形上是否存在一点(x,y)满足点(x,y)到圆心的距离大于等于半径,如果满足则说明有公共点,不满足则说明没有公共点。求出最小的(x-x0)和(y-y0)即可得出矩形上的点到圆的最短距离,再与半径比较即可。1.如果x1<=x0<=x2:则(x-x0)min=0。2.如果x1>x0:则(x-x0)min=x1-x0。3.如果x2<x0:则(x-x0)min=x0-x2。同理可求得最小的(y-y0);原创 2023-06-25 22:50:38 · 33 阅读 · 0 评论 -
2023.6.23每日一题
本题有个小坑点,在max比较时不能直接和strs[i].size()比较,max比较只能比较两个相同类型的,vector.size()是unsigned long long无法直接比较需要强转。原创 2023-06-23 00:48:08 · 59 阅读 · 0 评论 -
2023.6.22每日一题
dfs模板题,向八个方向搜索,越界或不是水域则返回,为了避免计算重复,搜过的水域置-1class Solution {public: vector<int> pondSizes(vector<vector<int>>& land) { int n=land.size(); int m=land[0].size(); vector<int>ans; fo原创 2023-06-23 00:01:28 · 34 阅读 · 0 评论 -
20223.6.21每日一题
此题可以通过维护一个栈,将到过的每个房间的钥匙push进去,每次访问栈顶的房间并标记,防止重复进入一个房间,在访问时再将用过的钥匙pop出去即可。其实此题也可以用bfs递归遍历,不过本质上和用栈维护是一个道理。原创 2023-06-21 23:58:04 · 199 阅读 · 0 评论 -
2023.6.19每日一题
此数要选,因为选了一个x,导致现在模3余数为j,这里的j是怎么来的,记上一次选完后的余数为q,j=(q+x)%3->q=(j-x)%3,防止j-x为负数%3出错,先对x%3再加上3后再%即可。在初始化时,dp[0][0]为0,dp[0][1]和dp[0][2]为-∞,因为这两种是不合法的,没有选数,自然不可能有余数。此数不选,所以此次状态dp[i][j]和上次状态dp[i-1][j]一样。选:dp[i][j]=dp[i-1][(j-x+3)%3]+x;不选: dp[i][j]=dp[i-1][j];原创 2023-06-19 22:20:52 · 28 阅读 · 0 评论 -
2023.6.18每日一题
此题可以用dfs搜索,以当前位置为0向上下左右四个方向搜索,当前位置为0时,只有当前位置处于矩阵边界时,不满足此岛屿为封闭岛的条件,否则此岛必为封闭岛,现在要做的是去找和它相连的0,把这个最大的封闭岛找出来,并标记,防止在下一次更新当前位置时重复计算。此题只要当前位置是0且不为边界,答案肯定要+1,dfs的作用是将与当前位置相连的所有0标记,防止下次搜索时重复计算。原创 2023-06-18 20:05:37 · 29 阅读 · 0 评论 -
2023.6.14每日一题
因为每次只能填一个数字,在第i步想要前i个都被填过,说明在这一步的所有填过最大的下标等于i,如果大于i,就说明i后面的数字被填过,一步只能填一个,那么必定前i个存在没有被填过的数字。原创 2023-06-14 22:57:55 · 39 阅读 · 0 评论 -
2023.6.12每日一题
②移动短板:下一次得到的宽度会缩小,但是最短的板子有可能会>当前的最短的板子,所以下一次的储水量可能会>当前储水量。①移动长板:下一次得到的宽度会缩小,并且最短的板子只会<=当前的最短的板子,所以下一次的储水量必定<=当前储水量。现在的问题是,利用什么样的策略去移动双指针呢,既然和板长有关系,就以板子长短来定。由此得出,在移动双指针时,将短板移动,一直去更新ans的最大值即可。现在就是去找出l,r,利用双指针遍历,l=0,r=n-1。和木桶效应有点像,储水量由宽度和最短的那个板决定。原创 2023-06-12 21:29:07 · 30 阅读 · 0 评论 -
2023.6.11每日一题
题目要求连续节点总和为0,这也就是说对这个链表做前缀和处理时这些连续节点的前后节点的前缀和相同。反过来想,如果有一个节点的前缀和和后面某个节点的前缀和相同,说明中间的和为0,可以删掉。原创 2023-06-11 23:31:54 · 30 阅读 · 0 评论 -
2023.6.10每日一题
对words提前做好处理,在每个queries中去和整个words对比,模拟即可。原创 2023-06-10 23:26:27 · 34 阅读 · 0 评论 -
2023.6.8每日一题
先确定当前正方形的起点,循环枚举他的最大边长(边长不超过任一总长且此正方形所在位置还未被覆盖)。循环中,如果满足刚才的条件,就把正方形所在位置填1,并找到下一个还未被填的起点继续dfs。经过观察和样例和数据范围,发现此题不太好找规律,数据范围小,故可以用dfs+回溯解决。2.如果没在1处返回并且当前铺的面积已经等于总面积n*m,便记录答案,返回。1.如果当前的使用的地砖数大于存的最小答案,就可以回溯,不再向下搜。在回溯中,只需要将上一步填过1的地方填0释放即可。原创 2023-06-08 22:20:57 · 40 阅读 · 0 评论 -
2023.6.7每日一题
假设所有的奶酪都让第二个老鼠吃掉,计算第二个老鼠的总得分sum。因为第一个老鼠还要吃掉k个替换第二个老鼠吃的k个,所以此时就要考虑替换哪k位数可以使sum最大,替换只能是第一只老鼠用第i位去替换第二只老鼠的第i位(一一对应),所以将n位都做差存入differ中,再排序找出最大的前k位数加入sum中即可。更新sum最大值:sum=sum+(max(differ)前k个)原创 2023-06-07 17:59:51 · 47 阅读 · 0 评论 -
2023.6.6每日一题
同样模拟,遍历之后比较即可。原创 2023-06-06 20:35:23 · 67 阅读 · 0 评论 -
2023.6.5每日一题
纯模拟,直接上代码吧。原创 2023-06-05 00:42:09 · 44 阅读 · 0 评论 -
2023.6.4每日一题
其次unique去重并不是删除重复元素,而是把重复的元素放在vector中的最后,unique返回的去重后的尾地址,再将去重后的尾地址~去重的前的尾地址erase。再用size可以获得去重后vector中的元素个数。此题思路很简单,排序后取第一个数和最后一个数的平均值保存,在将第一个数和最后一个数删除,一直循环到数组为空。再统计平均值中不相同的个数(去重)即可。因为unique是去除相邻元素中重复的,所以要先将待去重的vector排序。原创 2023-06-04 14:24:08 · 37 阅读 · 0 评论 -
2023.6.3每日一题
二:在统计完当前字串长度后,就要开始判断后面是否有相隔一个且相同的字串,如果有且后一个串不为结尾(即后一个串末尾-前一个串开头< 该字母出现的总次数),就用④更新;一:在统计完当前子串长度后,判断此字母出现的总次数和当前字串长度的大小,如果前者大于后者,先用②更新一下(如果有此串后面有串且中间隔一个在后面会再更新一次覆盖掉);④:"aaabaaaba"这种有两组且中间隔一个且后一组不为结束的,更新当前答案为两串之和+1;③:"aaabaaa"这种有两组且中间隔一个且后一组为结束的,更新当前答案为两串之和。原创 2023-06-04 00:57:54 · 58 阅读 · 1 评论 -
2023.6.2每日一题
定义每个words下标如果是以元音开头和结尾的字符串为1,否则为2,那么每个下标的值为0或1,根据题目要求判断区间内所有下标加起来有多少个,因为是多组数据判断,所以可以用前缀和处理从0~n之间的和,在查询时两个区间做差即可。在面对对一组数据需要加和在给定区间中多次读取数据时,前缀和可以大大减小时间复杂度。原创 2023-06-02 23:27:15 · 29 阅读 · 0 评论 -
2023.6.1每日一题
check中:因为此题给定k,所以要在price中找到k个值满足相邻两个价格>=mid,首先以第一个price为基准向后查找第一个差值>=mid的价格,找到后计数+1,再以此price为基准向后查找,最后判断cnt和k的关系,cnt<k即不满足,甜蜜、度大了;在二分之前首先对price进行升序排序,在二分初始化中:left=0,right=price[n-1]-price[0],mid=(left+right+1)/2,然后在left和right中搜索最大甜蜜值。原创 2023-06-01 19:17:49 · 42 阅读 · 0 评论