当前位置: 首页 > wzjs >正文

汕尾网站建设 生意好吗网站后台

汕尾网站建设 生意好吗,网站后台,html5手机网站开发,东莞有哪些公司4. 2875.无限数组的最短子数组(中等,学习) 2875. 无限数组的最短子数组 - 力扣(LeetCode) 思想 1.下标从 0 开始的数组 infinite_nums 是通过无限地将 nums 的元素追加到自己之后生成的。请你从 infinite_nums 中找出满足 元素和 等于 target 的 最短…
4. 2875.无限数组的最短子数组(中等,学习)

2875. 无限数组的最短子数组 - 力扣(LeetCode)

思想

1.下标从 0 开始的数组 infinite_nums 是通过无限地将 nums 的元素追加到自己之后生成的。请你从 infinite_nums 中找出满足 元素和 等于 target最短 子数组,并返回该子数组的长度。如果不存在满足条件的子数组,返回 -1
2.我的想法是infinite_nums由无数个nums组合而来,但是左端点left不能超过n,因为如果超过n说明可以向左平移让left在[0,n)之间,所以最外层while循环条件为left<n,但是最后两个测试点会超时,因为n很大情况下,子数组不存在满足条件,left要在内部while循环sum>target成立条件下才能右移,会出现right和left交替右移的情况,耗时很长。
3.学习另一种思想:
因为nums数组totalSum已知,而如果target覆盖多个nums数组,一定能写成如下形式:
target=k*totalSum+target%totalSum
所以问题转变为求两个nums范围内,和为target%totalSum的最小长度minRem,然后答案为minRem+k*n
如下图所示
在这里插入图片描述
4.保持left和right的右移,要映射到数组上才取余n,而不是让left和right加1就取余n,会导致算长度变复杂

代码

c++:
1.我的

class Solution {
public:int minSizeSubarray(vector<int>& nums, int target) {int n = nums.size();int res = INT_MAX;long long sum = 0;int left = 0, right = 0;while (left < n) { // 会超时sum += nums[right % n];while (sum > target) {sum -= nums[left % n];++left; // 特定条件left才右移}if (sum == target)res = min(res, right - left + 1);++right;}if (res == INT_MAX)return -1;return res;}
};

2.学习

class Solution {
public:int minSizeSubarray(vector<int>& nums, int target) {int n = nums.size();int res = INT_MAX;long long sum = 0, totalSum = 0;for (int x : nums)totalSum += x;int left = 0;int k = target / totalSum, rem = target % totalSum;for (int right = 0; right < 2 * n; ++right) {sum += nums[right % n];while (sum > rem) {sum -= nums[left % n];++left;}if (sum == rem)res = min(res, right - left + 1);}if (res == INT_MAX)return -1;return res + k * n;}
};
剩下两道困难第2轮再刷

2.3 求子数组个数

模版套路
套路
题目描述
学习经验

1.求个数开long long res

2.3.1 越长越合法

一般要写 ans += left。
内层循环结束后,[left,right] 这个子数组是不满足题目要求的,但在退出内层循环之前的最后一轮循环,[left−1,right] 是满足题目要求的。由于子数组越长,越能满足题目要求,所以除了 [left−1,right],还有 [left−2,right],[left−3,right],…,[0,right] 都是满足要求的。也就是说,当右端点固定在 right 时,左端点在 0,1,2,…,left−1 的所有子数组都是满足要求的,这一共有 left 个

class Solution {
public:int numberOfSubstrings(string s) {int n = s.size();int res = 0;unordered_map<char, int> cnt;int left = 0;for (int right = 0; right < n; ++right) {// 1. 入窗口++cnt[s[right]];// 2. 满足条件进入while循环while (cnt['a'] >= 1 && cnt['b'] >= 1 && cnt['c'] >= 1) {--cnt[s[left]];++left;}// 3.// 此时[left,right]不满足条件,但[left-1,right]满足条件,对于当前固定的right,新增了[0,left-1]共left个答案res += left;}return res;}
};
  • 题目描述

1.给你一个字符串 s ,它只包含三种字符 a, b 和 c 。请你返回 a,b 和 c 都 至少 出现过一次(窗口条件)的子字符串数目
2.给你一个整数数组 nums 和一个 正整数 k 。请你统计有多少满足 nums 中的 最大 元素」至少出现 k(窗口条件)的子数组,并返回满足这一条件的子数组的数目
(注意:题目说的最大元素指整个 nums 数组的最大值,不是子数组的最大值。)

  • 学习经验

1.相比于2.1和2.2求最长或最短满足条件的窗口大小,2.3求子数组个数是要求所有满足条件的窗口个数,所以右端点right更新到某一个值固定后,让left右移直到不满足条件,使得[left,right]不满足条件,而[left-1,right]满足条件,新增了[0,left-1]共left个答案
2.得保证[left,right]不满足条件,但[left-1,right]刚好满足条件,且[[0,left-1],right]都满足条件,res才能+left个

  • 1. 1358. 包含所有三种字符的子字符数目(中等,学习)

1358. 包含所有三种字符的子字符串数目 - 力扣(LeetCode)

思想

1.给你一个字符串 s ,它只包含三种字符 a, b 和 c 。请你返回 a,b 和 c 都 至少 出现过一次的子字符串数目。

代码
class Solution {
public:int numberOfSubstrings(string s) {int n = s.size();int res = 0;unordered_map<char, int> cnt;int left = 0;for (int right = 0; right < n; ++right) {// 1. 入窗口++cnt[s[right]];// 2. 满足条件进入while循环while (cnt['a'] >= 1 && cnt['b'] >= 1 && cnt['c'] >= 1) {--cnt[s[left]];++left;}// 3.// 此时[left,right]不满足条件,但[left-1,right]满足条件,对于当前固定的right,新增了[0,left-1]共left个答案res += left;}return res;}
};
  • 2.2962.统计最大元素出现至少K次的子数组(中等,题目条件看错了)

2962. 统计最大元素出现至少 K 次的子数组 - 力扣(LeetCode)

  • 思想

1.给你一个整数数组 nums 和一个 正整数 k 。请你统计有多少满足 「 nums 中的 最大 元素」至少出现 k 次的子数组,并返回满足这一条件的子数组的数目。
注意:题目说的最大元素指整个 nums 数组的最大值,不是子数组的最大值。所以需要提取得到nums数组最大值,而不是在遍历中动态更新

  • 代码

c++:

class Solution {
public:long long countSubarrays(vector<int>& nums, int k) {int n = nums.size();long long res = 0;int maxVal = INT_MIN, maxNum = 0;for (int x : nums)maxVal = max(maxVal, x);int left = 0;for (int right = 0; right < n; ++right) {if (nums[right] == maxVal)++maxNum;while (maxNum >= k) {if (nums[left] == maxVal)--maxNum;++left;}res += (long long)left;}return res;}
};

文章转载自:

http://klzey7Gi.smfbw.cn
http://JMqG392m.smfbw.cn
http://wA93rDdd.smfbw.cn
http://3xQIQNil.smfbw.cn
http://gdEBvQJF.smfbw.cn
http://lQEs3t9j.smfbw.cn
http://Jfl1g3Wm.smfbw.cn
http://6doSCUyw.smfbw.cn
http://SdgPKZps.smfbw.cn
http://iMh3imrz.smfbw.cn
http://b4ugUkxg.smfbw.cn
http://6Ay3Iz7q.smfbw.cn
http://4GSYLDP7.smfbw.cn
http://VzFTLn0m.smfbw.cn
http://heqKxEW2.smfbw.cn
http://J7ANjFsR.smfbw.cn
http://i6EsaYxQ.smfbw.cn
http://lGdFaPjb.smfbw.cn
http://6fiwQtOu.smfbw.cn
http://xyeLJzhS.smfbw.cn
http://laXpLGW2.smfbw.cn
http://SXUzvZ8H.smfbw.cn
http://HjvGBbVq.smfbw.cn
http://sisHWxaM.smfbw.cn
http://ddi4bxW1.smfbw.cn
http://cO4PfIGU.smfbw.cn
http://ho7ZR2s4.smfbw.cn
http://BkcdyzJU.smfbw.cn
http://polalyzj.smfbw.cn
http://bvuJ8f4s.smfbw.cn
http://www.dtcms.com/wzjs/667136.html

相关文章:

  • 网站建设众包服务平台wordpress登陆后台
  • 做英文网站用什么源码wordpress+布局插件
  • 网站开发有哪些常用工具公司网站开发实训报告
  • 知名的家居行业网站开发昆明网络推广招聘
  • 网站建设基本内容非自己的网站如何做二次跳转
  • 绿色模板网站怎么把网站扒下来
  • 网站谷歌优化怎么做云服务器优惠活动
  • 网站页面统计代码公众号运营内容
  • 网站搜索显示图片阿里云1M做网站
  • 电商网站seo排名哪里可以做营销型网站
  • 模板网站建设开发阿里云oss做网站
  • 域名申请哪家好网站内容如何优化
  • 广告设计与制作专业属于什么大类seo关键词找29火星软件
  • 网站建设技术问题代理主要干什么
  • 网站点击率如何做wordpress 邮件配置
  • 网站建设 千助连云港专业网站制作公司
  • php小说采集网站源码哪里有人收费做网站
  • 河北省城乡与建设厅网站邵阳哪里做网站
  • 谷歌翻译做多语言网站静态网页设计素材
  • 怎样用dw做 网站首页河口企业网站开发公司
  • 秦皇岛网站建设公司中英文网站源码 免费
  • 肇庆建设工程备案的网站ai生成logo
  • 咸阳网站建设公司电话网站建设类论文格式
  • 做网站多少Wordpress变装
  • 图书馆网站建设的规章制度网站建设淄博
  • 软件项目和网站建设的区别自己电脑做网站需要备案吗2
  • vps搭建vpn无法访问国内网站出入成都最新通知今天
  • 网站尺寸福州制作公司网站
  • 建设门户网站的可行性分析安徽网站建设优化推广
  • 汽车精品设计网站建设如何做酒店网站