周赛题
历次参加周赛的总结
重you小垃
这个作者很懒,什么都没留下…
展开
-
2449. 使数组相似的最少操作次数(困难,周赛)
由于题目保证:一定能变得与tagert相似。因此将题目进行简化成+1 -1的形式,由于两个数组元素和相等,因此最小和最小的匹配,次小的两个匹配…回到原问题,那么+2 -2怎么做呢?+2 -2并不会改变奇偶性,因此最小奇两个匹配,次小奇匹配,偶数同理。由于+2 -2每次变化量为4,因此ans/4为结果。原创 2022-10-26 17:15:49 · 354 阅读 · 0 评论 -
2448. 使数组相等的最小开销(困难,周赛)
这道题可以转化为:cost[i]是nums[i]出现的次数,然后都转化为中位数。参考题目:leetcode462. 最小操作次数使数组元素相等。为什么目标是中位数呢?根据中位数贪心的思想。原创 2022-10-26 16:57:21 · 372 阅读 · 0 评论 -
leetcode6132. 使数组中所有元素都等于零(简单,周赛)
代码】leetcode6132.使数组中所有元素都等于零(简单,周赛)原创 2022-07-31 14:59:20 · 194 阅读 · 0 评论 -
leetcode6133. 分组的最大数量(中等)
找满足m*(1+m)/2原创 2022-07-31 13:10:46 · 142 阅读 · 0 评论 -
leetcode6114. 移动片段得到字符串(中等,周赛)
思路:思维需要满足两个条件:1:L和R出现的顺序是一样的2:L:start的下标i >= tagert的下标j R:start的下标i 双指针原创 2022-07-10 16:03:57 · 192 阅读 · 0 评论 -
leetcode6109. 知道秘密的人数(中等,周赛)
思路:dp + 前缀和具体思路:dp[i]表示第i天新增的人数,而不是第i天知道秘密的人数dp[i]表示第i天知道秘密的人数,逻辑有问题,存在重复…状态转移方程:dp[i] = sum(dp[i-forget+1]…dp[i-delay])ans:sum(dp[n-forget+1]…dp[n])代码上的技巧1:i - delay >= 0 ? sum[i - delay] : 0 可以写成:sum[max(i - delay, 0)]技巧2:防止ans:(sum[n] - su原创 2022-07-03 20:30:27 · 151 阅读 · 0 评论 -
leetcode2305. 公平分发饼干(中等,周赛,状压dp)
思路一:暴力dfs,时间复杂度为O(n^n),时间复杂度有些高。思路二:子集划分+子集个数有限制->状压dp 时间复杂度O(n * 3^n)是固定的状压dp相关知识:具体思路:dp[i][j]表示消耗的集合个数为i,选择的饼干为j所获得饼干最大总数的最小值。i的取值为1->k j的取值为1->(1......原创 2022-07-01 09:46:39 · 320 阅读 · 0 评论 -
leetcode2312. 卖木头块(困难,周赛)
思路:dp如何想到dp的?垂直/水平切割,得到更小的子问题先垂直再水平和先水平再垂直会得到同样大小的两块木块,因此1:存在重复子问题对于同样高和宽的两个木块所获得的最多钱数和得到这两个木块的过程无关,因此2:无后效性获得两块小木块的最多钱数,就获得了大木块的最多钱数,因此3:最优子结构满足以上三个条件,因此->dp状态转移:p[m][n]表示高m宽n的木块能获得的最大钱数dp[m][n]能直接卖的话获得一个pricedp[m][n]=max(dp[m][j]+dp[m][n-j]),1.原创 2022-06-30 21:26:24 · 224 阅读 · 0 评论 -
leetcode2311. 小于等于 K 的最长二进制子序列(中等,周赛)
思路:贪心具体细节:想找到小于k的最小子序列,因此思想是在前面补尽量多的0,贪心的思想,假设k有m位,取最后m位/m-1位,再加上前面所有的0,即为ans代码难点:string按照二进制来转int :stoi(s, nullptr, 2)......原创 2022-06-30 21:23:04 · 278 阅读 · 0 评论 -
leetcode2310. 个位数字为 K 的整数之和(中等,周赛)
方法一:完全背包在包含结尾是k的数组中,每个元素可选多次,和为num的最少个数方法二:考虑个位数->数学问题具体思路:i最少个数为1,最多为num,num只有3000,因此可以试着枚举假设每个元素x= 10m+k即找到最小的i使得num=10m’+ik成立,即:遍历i,使得 (num-i k)%10==0 ,找到即return i......原创 2022-06-30 21:20:32 · 196 阅读 · 0 评论 -
leetcode2309. 兼具大小写的最好英文字母(简单,周赛)
优化1:遍历的时候,从后往前遍历,遍历到a[]和b[]都为true,则return优化2: 用位运算将空间优化到O(1)具体思路:'A’65->90 97->122 122-65+1=58 需要用8字节也就是long long类型来存状态添加ch:flag |= (ch - ‘A’)判断大小写字母存在:flag =(flag>>(‘a’-‘A’) & flag)为true得到ans:‘A’ + (flag的位数:64 - __builtin_clzll(flag)) - 1易错点:1ll 左移原创 2022-06-30 21:15:07 · 138 阅读 · 0 评论 -
leetcode5904.统计按位或能得到最大值的子集数目(周赛,中等)
由于是对每个可选可不选,相当于01背包,所以自己用DFS写的:class Solution {public: long long ans = 0; int ma = 0; int n; void dfs(int index, vector<int>& nums, int tmp); int countMaxOrSubsets(vector<int>& nums) { n = nums....原创 2021-10-17 13:17:47 · 209 阅读 · 0 评论 -
leetcode2295. 替换数组中的元素(周赛,中等)
思路:hash难点:初始元素值各不相同->换成一个在nums[i]不相同的值->每轮操作后数组内的元素依旧不相同,因此每轮替换只会替换一个元素。难度升级:如果每轮替换可能会修改多个下标呢?此时就不能这么做了,O(n^2)的复杂度会超时解决方案:倒着访问operations3->6 5->6 6->7 也就是:3 5 6 都修改为7,先把6修改为7,产生映射6->7,修改5时,发现6存在映射,此时修改为7,产生5->hash[6]的映射,修改3时,再产生3->hash[5]的映射。错误思路:并查集原创 2022-06-07 11:34:37 · 143 阅读 · 0 评论 -
leetcode2294. 划分数组使最大差为 K(周赛,中等)
思路:划分子序列+只考虑每个子序列中的值,不考虑子序列内元素的顺序->跟顺序无关,直接排序->贪心代码优化:不需要定义pre来记录这一轮upper_bound()开始的元素值,因为nums[index]就是pre,因此定义一个变量index就可以。......原创 2022-06-07 11:12:45 · 224 阅读 · 0 评论 -
leetcode6080. 使数组按非递减顺序排列(周赛,中等)
思路:list模拟时间复杂度分析: 最能就是把所有元素删除完,因此复杂度为元素的数目O(n)具体思路:删除nums[i]后,右边的向左移,因此下一轮可能被删除的就是nums[i+1]的元素(由上一轮删除的能推出下一轮可能会的),因此,用list来删除元素来达到O(1)删除的目的。实现:vector保存每一轮要被删除的元素,不断更新vector,直到vector为空为止class Solution {public: int totalSteps(vector<int>&am...原创 2022-05-29 20:02:14 · 317 阅读 · 0 评论 -
leetcode2281.巫师的总力量和(周赛,困难)
思路:看到子数组内的最小值->dp得到以arr[i]结尾/开始所有子数组的最小值的和即:leetcode907. 子数组的最小值之和(中等)https://blog.csdn.net/zhangjiaji111/article/details/124974780思路转换:arr[i]贡献:arr[i] * 包括arr[i]的子数组中最小值的和转化为:arr[i] * (所有子数组的和 - 不包括arr[i]的子数组的最小值的和)设l[i]表示以arr[i]所有结尾子数组的最小值的和...原创 2022-05-26 11:11:21 · 407 阅读 · 0 评论 -
leetcode5892.石子游戏(中等,周赛)
思路:先按照余数进行分组。当前去掉的余数为1时下次只能选择0/2,如果余数为2时下次只能选择0/2。由于mod为0的个数不影响余数,先不考虑mod为0的数字,此时序列是固定的,所以总共的次数是序列重复不下去的个数+mod为0的个数,如果个数为偶数或者所有的数字都用完了:return false 否则return true。难点: 没有想到先考虑mod为0的数字,此时数位序列是固定的!!!假设先移走1 :序列为11212121212…重复下去假设先移走2:序列为2212121212…重复下去...原创 2021-10-03 17:21:25 · 231 阅读 · 0 评论 -
leetcode2017网格游戏(中等,周赛)
思路:第一个机器人移动的路径是一个 一丨一(像Z),所以第二个机器人想要收集的点数最多,也就是取右上方和坐下方的较大值,即:第一个机器人找出一个下标index,使得max(grid[1][index]左边的和,grid[0][index]右边的和)最小。class Solution {public: long long gridGame(vector<vector<int>>& grid) { int n = grid[0].size()...原创 2021-10-03 22:21:01 · 181 阅读 · 0 评论 -
leetcode5895.获取单值网格的最小操作数(中等,周赛)
矩阵中每个值跟第一个值做差:对x余数都等于0则进行,否则返回-1.自己的错误思路:都往平均值靠拢是最优的,但这种思路被推翻了!!!举个例子:1 2 3 1000 (x=1)如果都向平均值251.5靠拢,则需要移动的个数为1497次,如果都向3靠拢的话,需要移动的次数是1000,1000<1497,所以我的思路是错误的。。。正确的思路:1:为什么用中位数?(证明1)假设最终的值是y,数组中比y小的值有p个,比y大的有q个。如果p<q,y向右移动一个位置(+x),次数变化p-q...原创 2021-10-10 22:23:14 · 166 阅读 · 0 评论 -
leetcode2034.股票价格波动(中等,周赛)
需求分析:●更新股票在某一时间戳的股票价格,如果有之前同一时间戳的价格,这一操作将正之前的错误价格。----------对于这个需求,考虑用hash表。也就是unordered_map<时间戳,价格>●找到当前记录里最新股票价格。最新股票价格定义为时间戳最晚的股票价格。----------对于这个需求,可以定义一个变量来存最大的时间戳●找到当前记录里股票的最高价格。----------对于这个需求,有两种解法:(1)用multiset存价格,并且删除价格的时候只能删除一个(2..原创 2021-10-11 11:29:38 · 218 阅读 · 0 评论 -
leetcode5902.检查句子中的数字是否递增(简单,周赛)
自己的代码是对字符串逐个遍历的,代码量多。优化:1:对含有空格的字符串分片。用stringstream更方便。getline(cin, s);stringstream ss(s);string str;while (ss >> str) { cout << str << endl; //依次输出每一个单词}2:string转intstoi(str);class Solution {public: bool areNumbersA...原创 2021-10-17 13:02:40 · 125 阅读 · 0 评论 -
leetcode5906.句子中的有效单词数(简单, 周赛)
做法: 一个字符一个字符判断就好易错点:1.连字符’-'至多有一个!!!2.连字符在每个token中只能有一个!!!class Solution {public: int countValidWords(string sentence) { int ans = 0; stringstream ss(sentence); string s; //int flag = 0; 不在这里!!! ...原创 2021-10-24 11:26:45 · 152 阅读 · 0 评论 -
leetcode5916.转化数字的最小运算数(周赛,中等)
思路:BFS细节: 每次把到达的数字放入队列,按照nums.size() × 3进行扩散,扩散到的数字下次扩散的时候就不用继续放入队列了。总结:1.遇到从一个值,到另外一个值最小操作次数的题目,要想到BFS2.难点在于判断广搜的终止条件:这道题是超过1000!!!class Solution {public: int minimumOperations(vector<int>& nums, int start, int goal) { //...原创 2021-10-31 13:56:57 · 122 阅读 · 0 评论 -
leetcode2064.分配给商店的最多商品的最小值(周赛,中等)
开始没思路。。。看了一下别人用的是二分,才恍然大悟,二分的经典题型解法:二分------------->O(mlogn)满足条件的最小值->二分没错了!1:mid过小->大于n2:mid过大->小于n3:left指向小于n的位置,right指向大于等于n的位置 最终return rightclass Solution {public: bool larger(vector<int>& quantities, int m, int n..原创 2021-11-09 20:35:52 · 274 阅读 · 0 评论 -
leetcode5186.区间内查询数字的频率(周赛,中等)
看到调用query不超过10^5次,则query()必须控制在O(logn)以内自己的思路: 定义一个unordered_map<int, set> hash; //值->set的下标映射 auto le = hash[value].lower_bound(left); for (; *le <= right && le != hash[value].end(); le++) { cnt++; } return cnt;用的set计算两个迭代..原创 2021-11-21 12:26:28 · 259 阅读 · 0 评论 -
leetcode5923.从房屋收集雨水需要的最少水桶数(中等,周赛)
自己的思路:贪心class Solution {public: int minimumBuckets(string street) { int n = street.size(); int i = 0, ans = 0; int flag = false; //false表示没有桶 while (i < n) { if (street[i] == '.' && ...原创 2021-11-28 16:14:06 · 266 阅读 · 0 评论 -
leetcode5942.找出3位偶数(周赛,中等)
自己的思路:set +根据每个组合下标写出num1…num6优化:1.由于结果是升序,所以用set做了,错误!!三位数只有100-999,用set做的话会对100^3个元素去重,没必要->直接用vis数组存是否访问过即可。2.这是排列的题,不会用排列模板,所以用num1…num6 分别表示三个下标的全排列组成的三位数!!!->改一下三重循环的初始值,都从0开始即可。组合模板:for (int i = 0; i < n; ++i) { for (int j = 0; j ...原创 2021-12-05 20:46:14 · 180 阅读 · 0 评论 -
leetcode5952.杆和环(简单,周赛)
自己的做法:定义3个长度为10的数组,分别对三个字母做标记,最后计算下标(满足三个数组都被标记)的个数。优化:用位运算做标记class Solution {public: int countPoints(string rings) { int n = rings.size(); vector<int> v(10); unordered_map<char, int> ump{{'R', 1}, {'...原创 2021-12-12 16:13:02 · 650 阅读 · 0 评论 -
leetcode5955.摘水果(困难,周赛)
自己没思路,感觉下标处理太麻烦了。。。有两种情况:1.假设人向左走 y 步,然后回到原点,再向右走 x步。2.假设人向右走 y 步,然后回到原点,再向左走 x步。写法:枚举x的长度即为所有情况!!!for (int x = 0; x <= k; ++x) { int y = (k - x) / 2; [startPos - x, startPos + y]的区间和(向右走 y 步,然后回到原点,再向左走 x步) [startPos - y, startPos + x]的区间和...原创 2021-12-12 22:20:46 · 599 阅读 · 0 评论 -
leetcode2099.找到和最大的长度为k的子序列(简单,周赛)
本质:找前k大值。难点:如何下标递增返回ans?解决方案:得到前k大值后,把出现的元素以及出现的个数放在hash中,然后遍历一遍数组,每次- -即可得到。class Solution {public: vector<int> maxSubsequence(vector<int>& nums, int k) { vector<int> ans; priority_queue<pair<int, int&...原创 2021-12-13 22:17:57 · 553 阅读 · 0 评论 -
leetcode2122还原原数组(困难,周赛)
自己没思路。。。思路: 排序+枚举higher的第最小值先排序,最小的元素一定是lower的第一个元素,然后枚举higher的第一个元素(j从1到n-1)并将它标记为true(长度为n的bool类型vis数组用于标记),这样k就确定了下来。除去这两个元素其余最小的就是lower的第二小值,然后用k计算得到higher的第二小(nums[j]+2*k)并将其标记为true(需要通过元素值找到下标值,这里用一个hash:元素值->vector的下标数组),重复这个过程,直到所有的元素都访问过。如...原创 2021-12-29 20:52:58 · 302 阅读 · 0 评论 -
leetcode5969.摧毁小行星(中等,周赛)
思路:贪心。每次找小于等于mass最大的值。class Solution {public: bool asteroidsDestroyed(int mass, vector<int>& asteroids) { multiset<int> st(asteroids.begin(), asteroids.end()); //multi int while (!st.empty()) { ...原创 2022-01-02 11:49:03 · 455 阅读 · 0 评论 -
leetcode2133.检查是否每一行每一列都包含全部整数(简单,周赛)
在自己的代码上做优化:1.用一个双循环实现行和列的同时访问:for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { //matrix[i][j] //matrix[j][i] }}2.看一下matrix[i][j]取值范围:放入hash后直接判断size()是否等于n就好了,不用跟存1-n的hash来比较。class Solution {public: bool checkValid(vec...原创 2022-01-11 10:42:39 · 1742 阅读 · 0 评论 -
leetcode2134. 最少交换次数来组合所有的 1 II(周赛,中等)
自己的思路:统计出最长的1,然后都向这个位置合并,在这个过程中使用前缀和,前缀和即前面1的个数。思路是错的!原因是可能出现插空的情况:比如:00001010100000011000前缀和代码上遇到的问题:1:前i个元素的和:sums[i]2:[i, j]元素的和:sums[j] - sums[i - 1]3:最末尾j个的元素的和:sums[n - 1] - sums[n - 1 - j]正解:固定长度滑动窗口+(前缀和)技巧:,滑动窗口的长度为1的个数。本题找最少交换,也就是滑动窗口中....原创 2022-01-11 11:02:55 · 464 阅读 · 0 评论 -
leetcode2135. 统计追加字母可以获得的单词数(周赛,中等)
题目中有很关键的条件:1:每个字符串都仅由小写字母组成——>用int作为hash足够了。2:任一字符串中,每个字母至多出现一次——>标记是否存在可以用hash难点:1:对任意一个在targetwords中的字符串,在startwords数组中找能形成它的字符串,用O(n)?数据范围是5×10的4次方,肯定会超时,于是尝试删除该字符串中的每个字符,看一下删除后的字符串在startwords中是否有对应的(O(n)降低到O(常数,26))。2:在跟startwords中是否有对应的字...原创 2022-01-11 11:24:08 · 258 阅读 · 0 评论 -
leetcode2148元素计数(简单,周赛)
自己的思路:大于数组中最小值&&小于数组中最大值的即满足条件的。class Solution {public: int countElements(vector<int>& nums) { int mi = nums[0], ma = nums[0], ans = 0; for (auto& a : nums) { mi = min(mi, a); ..原创 2022-01-24 21:36:52 · 234 阅读 · 0 评论 -
leetcode2151.基于陈述统计最多好人数(困难,周赛)
发现n最多只到15,想到暴力枚举。具体思路:二进制枚举,1代表好人,0代表坏人。然后看是否与实际情况是否相符(j->k为1但是i的二进制第k位为0 或者 j->k为0但是i的二进制第k位为1)即可。i枚举状态 每一位1代表好人0代表坏人j代表第j个人不符实际情况:s[j][k]==1&& (1<<k) & i ==0 或者s[j][k]==0&&(1<<k)&iclass Solution {public...原创 2022-01-24 21:44:31 · 348 阅读 · 0 评论 -
leetcode2139.得到目标值的最少行动次数(周赛,中等)
逆向思维:什么时候×2?尽量大的时候×2!!!所以从tagert逆向思考:如果二进制末尾是1,只能用-1.否则如果maxDoubles大于0,使用/2,否则直接用-1。class Solution {public: int minMoves(int target, int maxDoubles) { int ans = 0; while (target != 1) { if (target & 1) { ...原创 2022-01-24 21:55:01 · 199 阅读 · 0 评论 -
leetcode2140.解决智力问题(周赛,中等)
知道是dp,但不会写状态转移方程。。。这是一道逆序dp,跟之前的dp不一样,这个是从后往前填表。dp[i]表示[i, n-1]所能获得的最高分数dp[i] = max(dp[i + 1],questions[i][0]+(i+questions[i][1]+1>=n)?0:dp[i+questions[i][1]+1])不做该题获得的分数为:dp[i + 1]做该题获得的分数为:questions[i][0]+(i+questions[i][1]+1>=n)?0:dp[i+que...原创 2022-01-24 23:02:06 · 215 阅读 · 0 评论 -
leetcode2141.同时运行N台电脑的最长时间(周赛,困难)
解法:二分。假设可以同时运行x分钟,则大于等于x的电池最多可以运行x分钟min(x, batteries[i])小于x的电池最多可以运行batteries[i]分钟min(x, batteries[i])。将这些求和sums,sums >= n *x就可以同时运行x分钟由于sums>=n * x,所以小于x的电池个数+大于等于x的电池个数一定大于等于电脑的个数。即:可以同时运行x分钟 的充要条件是:sums>=n * x。电池的安排:大于等于x的单独负责一个电脑,小于...原创 2022-01-26 13:31:23 · 522 阅读 · 0 评论