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

智慧网站建设建议品牌网络推广

智慧网站建设建议,品牌网络推广,wordpress伪静态 404,seo和网站建设那个先学1.题目 问题描述 当一个数列&#xff0c;最大值和最小值的差低于某一阈值时&#xff0c;称这个数列是迷人数列。 现给定一个由 n 个整数构成的数列和阈值 k&#xff0c;问存在多少个连续子序列是迷人的。 输入格式 第一行包含 2 个数字 n, k (1 < n < 100000, 0 <…

1.题目

问题描述

当一个数列,最大值和最小值的差低于某一阈值时,称这个数列是迷人数列。

现给定一个由 n 个整数构成的数列和阈值 k,问存在多少个连续子序列是迷人的。

输入格式

第一行包含 2 个数字 n, k (1 <= n <= 1000000 < k <= 10^9)

第二行包含 n 个整数:a[1], a[2],..., a[n] (0 <= a[i] <= 10^9)

输出格式

输出迷人连续子序列的数目

输入样例

4 2

3 1 2 4

输出样例

5

数据范围

共 10 组数据。2 组数据 n 小于 1000;其余数据 n 等于 100000。

2.样例解析

输入样例

4 2

3 1 2 4

输出样例

5

当一个数列,最大值和最小值的差小于等于某一阈值时,称这个数列是迷人数列,此处的输出应该是8。

8个迷人子序列为:{3},{1},{2},{4},{3,1}{1,2},{2,4},{3,1,2}

3.思路

由于我们需要找到的是满足 max(a[i...j]) - min(a[i...j]) < k 的所有连续子序列,可以考虑使用 滑动窗口(即双指针法)来解决。

  1. 我们使用两个指针 leftright,维护一个当前的子序列 a[left...right],并逐步扩展右指针。
  2. max(a[left...right]) - min(a[left...right]) 满足条件时,我们可以将子序列的左指针 left 继续向右移动,直到不满足条件为止。
  3. 统计符合条件的连续子序列的数量。

4.代码

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;int solution(int n, int k, std::vector<int> sequence) {// Please write your code hereint left = 0;int right = 0;int result = 0;int min_val = sequence[0];int max_val = sequence[0];while (left < n && right < n && left <= right) {// 更新当前窗口的最大值和最小值(右移之后)min_val = min(min_val, sequence[right]);max_val = max(max_val, sequence[right]);if ((max_val - min_val) < k) { // 符合条件,右指针右移result++;right++;}else { //不符合条件,左指针右移left++;//更新当前窗口的最大值和最小值min_val = *min_element(sequence.begin() + left, sequence.begin() + right + 1);max_val = *max_element(sequence.begin() + left, sequence.begin() + right + 1);}} return result;
}int main() {// You can add more test cases herestd::vector<int> sequence1 = {3, 1, 2, 4};std::vector<int> sequence2 = {7, 3, 5, 1, 9};std::vector<int> sequence3 =  {2, 2, 3, 1, 1, 2};std::cout << (solution(4, 2, sequence1) == 8) << std::endl;std::cout << (solution(5, 3, sequence2) == 6) << std::endl;std::cout << (solution(6, 1, sequence3) == 12) << std::endl;return 0;
}

代码修改:

  • result++改为result += (right - left + 1)
  • (max_val - min_val)< k改为(max_val - min_val) ≤ k
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;int solution(int n, int k, std::vector<int> sequence) {// Please write your code hereint left = 0;int right = 0;int result = 0;int min_val = sequence[0];int max_val = sequence[0];while (left < n && right < n && left <= right) {// 更新当前窗口的最大值和最小值(右移之后)min_val = min(min_val, sequence[right]);max_val = max(max_val, sequence[right]);if ((max_val - min_val) <= k) { // 符合条件,右指针右移result += (right - left + 1);right++;}else { //不符合条件,左指针右移left++;//更新当前窗口的最大值和最小值min_val = *min_element(sequence.begin() + left, sequence.begin() + right + 1);max_val = *max_element(sequence.begin() + left, sequence.begin() + right + 1);}} return result;
}int main() {// You can add more test cases herestd::vector<int> sequence1 = {3, 1, 2, 4};std::vector<int> sequence2 = {7, 3, 5, 1, 9};std::vector<int> sequence3 =  {2, 2, 3, 1, 1, 2};std::cout << (solution(4, 2, sequence1) == 8) << std::endl;std::cout << (solution(5, 3, sequence2) == 6) << std::endl;std::cout << (solution(6, 1, sequence3) == 12) << std::endl;return 0;
}

代码详解:

result += (right - left + 1)

对于每个 right,如果窗口 [left, right] 的最大值和最小值之差小于等于 k,则此窗口中的所有子序列都符合条件。

具体的子序列数量:

  • 对于每个固定的 right,所有以 leftright 为子序列的组合都满足条件。

  • 这些子序列的个数就是窗口内的所有可能的子序列数,即从 leftright 形成的连续子序列。

  • 例如,如果窗口是 [left, right],那么所有可能的子序列是:

    • sequence[left]
    • sequence[left+1]
    • sequence[left+2]
    • ...
    • sequence[right]

    这些子序列的数量就是 (right - left + 1)。因此,每次窗口扩展时,我们就可以通过 result += (right - left + 1) 来累加符合条件的子序列数量。

min_val = *std::min_element(sequence.begin() + left, sequence.begin() + right + 1);
max_val = *std::max_element(sequence.begin() + left, sequence.begin() + right + 1);
  1. std::min_element:
    • 这个函数返回指定范围内的最小元素的迭代器。
    • 语法:std::min_element(first, last)
      • first:指向范围的起始位置的迭代器。
      • last:指向范围的结束位置的迭代器(不包括该位置)。
    • 返回值:指向范围内最小元素的迭代器。
  2. std::max_element:
    • 这个函数返回指定范围内的最大元素的迭代器。
    • 语法:std::max_element(first, last)
      • first:指向范围的起始位置的迭代器。
      • last:指向范围的结束位置的迭代器(不包括该位置)。
    • 返回值:指向范围内最大元素的迭代器。
  3. std::min_element 和 std::max_element 是 C++ 标准库中的函数,用于在给定的范围内找到最小值和最大值的迭代器。为了获取这些迭代器指向的实际值,你需要对它们进行解引用操作,即使用 * 运算符。

http://www.dtcms.com/wzjs/134830.html

相关文章:

  • 光谷做网站免费个人网站建设
  • 什么公司需要建立网站吗免费外链网站
  • 用shopify 做网站google下载手机版
  • 万网域名指向网站宁波seo托管公司
  • 帝国cms 商城网站视频教程新网站seo外包
  • 如何找做网站的客户优化网站建设
  • 俱乐部网站模板app线下推广怎么做
  • 枣庄网站建设 网站设计 网站制作正规网站优化哪个公司好
  • 网站建设制作哪家好百度一下官网网址
  • 手机怎么做自己的网站西安市网站
  • 湖南移动网站建设益阳网络推广
  • 企业商务网站设计与开发百度指数的数据来源
  • 哪家网站建设搜索引擎营销的特点有
  • 网站开发api平台发布软文
  • 做万词霸屏后网站关键词没有排名厦门网站快速排名优化
  • 重庆奉节网站建设公司推荐谷歌浏览器 官网下载
  • 哪个网站网页做的好看在百度上怎么打广告
  • 做租人网站犯法吗百度自然排名优化
  • 提供信息门户网站制作全球十大搜索引擎排名
  • 网站推广排名教程汕头seo关键词排名
  • b站推广入口mba智库在线观看今天刚刚发生的新闻最新新闻
  • wordpress多站点开启属于b2b的网站有哪些
  • 切片工具做网站怎么做谷歌seo网站建设
  • html5手机版seo优化服务
  • 网站建设_你真的懂吗?制作网页一般多少钱
  • 某服装公司网站建设论文抖音推广佣金平台
  • 贵阳做网站多少钱促销方案
  • 网站建设项目的工作分解ciliba磁力搜索引擎
  • 安乡网站制作软考培训机构哪家好一点
  • 网站后台上传模板网络营销的含义