862. 和至少为 K 的最短子数组
先从朴素的思想去考:
枚举当前的前缀和kkk,那么我们需要找到当前位置之前的满足差大于等于kkk的最大位置。

i<ji<ji<j,且 pre[i]≥pre[j]pre[i]\geq pre[j]pre[i]≥pre[j],那么pre[cur]−pre[i]≥kpre[cur]-pre[i]\geq kpre[cur]−pre[i]≥k,必然有pre[cur]−pre[j]≥kpre[cur]-pre[j] \geq kpre[cur]−pre[j]≥k,iii就没有存在的必要了。

就是说,如果一个人比你小(更靠近当前枚举的位置),还比你强(与当前前缀和作差得到更大的值),那你就没存在的必要了(doge)

维护一个递增的单调队列,每次从队头遍历所有pre[cur]−pre[j]≥kpre[cur]-pre[j]\geq kpre[cur]−pre[j]≥k的jjj,并且同时弹出队头,因为与pre[cur]−pre[j]≥kpre[cur]-pre[j]\geq kpre[cur]−pre[j]≥k的jjj,可以构成符合条件的最小子数组的右边界就是curcurcur

class Solution {public:int shortestSubarray(vector<int>& nums, int k) {int n = nums.size();vector<long long> pre(n, -(1ll << 60));vector<int> q(n);int hh = 0, tt = -1;int res = 0x3f3f3f3f;for(int i = 0; i < n; ++i) {pre[i] = nums[i];if(i > 0) pre[i] += pre[i - 1];if(pre[i] >= k) res = min(res, i + 1);while(hh <= tt && pre[q[tt]] >= pre[i]) tt -= 1;while(hh <= tt && pre[i] - pre[q[hh]] >= k) { res = min(res, i - q[hh]);hh += 1;} q[++tt] = i;}return res == 0x3f3f3f3f ? -1 : res;}
};

30. 串联所有单词的子串
本题需要找到所有覆盖掉wordswordswords数组的sss中的子串
可以考虑枚举起点,因为wordswordswords数组中每个元素的长度一样,考虑枚举起点为[0,words[0].size())[0,words[0].size())[0,words[0].size())。
这样可以有双指针去操作,当每次双指针判断后长度恰好为words[0].size()∗words.size()words[0].size()*words.size()words[0].size()∗words.size(),那么就找到了这样一个子串,记录即可。

class Solution {public:vector<int> findSubstring(string s, vector<string>& words) {int len = words[0].size();int cnt = words.size();int total = cnt * len;int n = s.size();vector<int> ans;unordered_map<string, int> act;for(auto& u : words) act[u] += 1;for(int i = 0; i < len; ++i) {unordered_map<string, int> cur; int l = i, r = i + len;while(r <= n) {string tword = s.substr(r - len, len);if(act.count(tword)) {int max_tword = act[tword];auto& cur_tword = cur[tword];if(cur_tword < max_tword) cur_tword += 1;else {while(cur_tword >= max_tword && l < r) {cur[s.substr(l, len)] -= 1;l += len;} cur_tword += 1;}} else {cur.clear();l = r;}if((r - l) / len == cnt) ans.push_back(l);r += len;}}return ans;}
};

315. 计算右侧小于当前元素的个数
树状数组求逆序对或者归并求逆序对两种解法都可,下面是树状数组。
如果是用树状数组,可以采用对应的离散化操作进行即可。

class Solution {public:vector<int> countSmaller(vector<int>& nums) {int n = nums.size();int base = 10001;int maxv = base << 1 | 1;vector<int> tr(maxv, 0);vector<int> res(n, 0);auto get = [&tr](int p) -> int {int sum = 0;while(p > 0) {sum += tr[p];p -= p & -p;}return sum;};auto add = [=, &tr](int p) {while(p < maxv) {tr[p] += 1;p += p & -p;}};for(int i = n - 1; i >= 0; --i) {res[i] = get(nums[i] + base - 1);add(nums[i] + base);}return res;}
};

1201. 丑数III
标着是mid,但是思维难度应该是hard,但是实际做法难度也就是mid难度,与丑数I 和丑数II并不同。
因为n≤2×109n\leq 2\times 10^9n≤2×109,所以线性做法也不可以。
考虑二分答案,每次checkcheckcheck当前值之前是否有nnn个即可。

class Solution {public:long long gcd(long long a, long long b) {return b == 0 ? a : gcd(b, a % b);}int nthUglyNumber(int n, int _a, int _b, int _c) {long long a = _a;long long b = _b;long long c = _c;long long ab = a / gcd(a, b) * b;long long bc = b / gcd(b, c) * c;long long ac = a / gcd(a, c) * c;long long abc = ab / gcd(ab, c) * c;long long l = min({a, b, c}), r = 2e9;while(l < r) {long long mid = l + r >> 1;if(mid / a + mid / b + mid / c - mid / ab - mid / ac - mid / bc + mid / abc >= n) r = mid;else l = mid + 1;}return l;}
};

815. 公交路线

#define sz(x) (int)x.size()
class Solution {public:int numBusesToDestination(vector<vector<int>>& r, int s, int t) {if(s == t) return 0;int n = r.size();vector<vector<bool>> g(n, vector<bool>(n, false));vector<int> dist(n, 0x3f3f3f3f);for(auto &u : r) sort(u.begin(), u.end());auto check = [](vector<int> &A, vector<int> &B) {int i = 0, j = 0;while(i < sz(A) && j < sz(B)) {if(A[i] == B[j]) return true;if(A[i] < B[j]) ++i; else ++j;}return false;};for(int i = 0; i < n; ++i) for(int j = i + 1; j < n; ++j)if(check(r[i], r[j])) g[i][j] = g[j][i] = 1;queue<int> q;for(int i = 0; i < n; ++i) {auto it = lower_bound(r[i].begin(), r[i].end(), s);if(it != r[i].end() && *it == s) q.push(i), dist[i] = 1;}while(!q.empty()) {int u = q.front(); q.pop();for(int i = 0; i < n; ++i) {int v = i;if(g[u][v] && dist[v] > dist[u] + 1) {dist[v] = dist[u] + 1;q.push(v);}}}int res = 0x3f3f3f3f;for(int i = 0; i < n; ++i) {auto it = lower_bound(r[i].begin(), r[i].end(), t);if(it != r[i].end() && *it == t) res = min(res, dist[i]);}if(res == 0x3f3f3f3f) res = -1;return res;}
};

一周Hard (2021.11.29-2021.12.05)相关推荐

  1. 史上最详细微信小程序授权登录与后端SprIngBoot交互操作说明,附源代码,有疑惑大家可以直接留言,蟹蟹 2021.11.29完善更新小程序代码,

    2021.11.29 更新文章 你好,我是博主宁在春,一起学习吧!!! 写这篇文章的原因,主要是因为最近在写毕业设计,用到了小程序,这中间曲曲折折,一言难尽啊.毕业设计真的让人麻脑阔

  2. 2021中石油程序设计平台新生热身赛7-挨打记录2021/11/29

    这期热身赛翘掉了,去看了院里的迎新晚会,得努力补啊...... 问题 A: 分组 时间限制: 1 Sec  内存限制: 128 MB 提交 状态 题目描述 一年一度的圣诞大联欢又要来临了.做为班长的小 ...

  3. F1--DDR3的应用总结(二)-2021.11.29

    DDR3应用总结(二) 接DDR3应用总结(一) 4.使用MIG IP核构建DDR3应用 截图取自Xilinx官方手册ug586,figure1-51,MIG IP核是一个逻辑模块,相当于是由它连接了 ...

  4. 论文阅读:2021.11.23~2021.12.1

    写在前面:本篇博客只是记录本人在这周看论文的过程中的一些思考,没有一点儿教程或其他意思,由于时间不够,某些细节的部分必然不会那么详细,分享出来就是想着能帮到看到的人也算是一件幸事,想了解细节的小伙伴还 ...

  5. Java学习日报—SQL基础—2021/11/29

    今天效率很低,就看了以下内容... 目录 1.1关键词DISTINCT 1.2 连表查询 1.2.1 内连接 1.2.2 外连接 1.3 查询执行顺序 1.1关键词DISTINCT DISTINCT  ...

  6. A. [2021.1.29多校省选模拟11]最大公约数(杜教筛/数论)

    A. [2021.1.29多校省选模拟11]最大公约数 这是一个杜教筛的经典题目,最后我们只需要筛一下1∗xμ(x)1*x\mu(x)1∗xμ(x)这个函数的前缀和即可,然后看到有111这个函数,我们 ...

  7. 2021年10月11月总结12月计划

    2021年10月11月总结12月计划 综合评价: 面子并不值钱.不要动不动就觉得伤自尊了.不要让面子问题成为自己的负资产.什么事情理性一些,做自己觉得最正确的事情,不要为了所谓的面子,而让自己吃亏,反 ...

  8. 2021.11.22-11.28 AI行业周刊(第73期):工作的需求

    篇章一:工作的需求 最近可能到了年底,很多朋友都在蠢蠢欲动,看外面的机会. 微信上最近每天也有几个朋友,和我实时分享他们最新的动态. 发现一个比较有意思的现象:人生不同阶段的人,求职的需求都比较相似. ...

  9. 首页推荐流支持快捷修改兴趣标签,问答支持展示gif【2021.11.8】

    hello,大家好,这里是「CSDN产品周报」第17期.本次更新主要涉及首页和问答两个产品模块,具体细节请往下看. 一.首页优化 1.「推荐」信息流新增「修改兴趣标签」按钮 从用户需求的角度考虑,对内 ...

  10. 2021.11.8-11.14 AI行业周刊(第71期):AI行业经验

    篇章一:行业经验 不同的AI公司,对于AI产品的场景定位不同. 有的公司是面向C端产品.有的公司专门做B端用户. 当然大白所在的公司,也有具体的定位,主要面向智慧金融.智慧机场.智慧城市. 之前,一直 ...

最新文章

  1. python的用途-请问在python中的% 是什么意思, 起到什么作用?
  2. 数据中心分布情况和业务占比分析
  3. mxnet基础到提高(7)--卷积神经网络基础(2)
  4. 使用Xshell链接阿里的Linux服务器
  5. 【51单片机快速入门指南】4.3: I2C读取MPU6050陀螺仪的原始数据
  6. ntce服务器不稳定,当心!你的教师资格证成绩失效了!| 服务
  7. 3D物体识别的假设检验
  8. Qt工作笔记- 解决cc1plus.exe: error: out of memory allocating
  9. Python画图库Turtle库详解篇
  10. 前端中实时显示当前时间的js代码
  11. 持续集成环境(Hudson)搭建
  12. 中国大学慕课计算机操作系统答案,计算机操作系统
  13. 正运动技术快速入门 | 篇十六:正运动控制器EtherCAT总线快速入门
  14. c语言写按键控制蜂鸣器,单片机按键控制蜂鸣器演奏音乐
  15. 2021年度训练联盟热身训练赛第八场 自我总结
  16. 爱奇艺视频怎么下载,如何将qsv格式转为mp4格式
  17. python用空格隔开每一个字符_Python(字符串操作实例1)一个字符串用空格隔开
  18. gird布局(网格布局)
  19. java 中vo、po、dto、bo、pojo、entity、mode如何区分
  20. 老毛子的二级路由,通过无线中继方式设置与主路由在同一网段

热门文章

  1. 宝可梦探险寻宝料理php,宝可梦探险寻宝料理配方 宝可梦探险寻宝食谱一览
  2. 零售金融的数字化转型,金易联拥抱流量平台、提供在线展业服务
  3. 网游行业联合运营问题研究
  4. mysql做十亿条数据查询_数据库优化:mysql数据库单机数十亿数据查询设计
  5. 作为一个在校大学生,是否有必要参加计算机培训班?
  6. 985计算机学校2017排名,2017年全国“985”大学排名及王牌专业全解析
  7. 安装oculus运行时出现问题_TOSUN丨实验室通风管道安装时应该避免的问题
  8. 【功防世界】base64stego
  9. CNN、Capsule详解
  10. 2014年1~3月中国移动游戏市场状况