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

智慧网站建设建议最近一周热点新闻

智慧网站建设建议,最近一周热点新闻,网站建设合同属于,手机网站网络环境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/426096.html

相关文章:

  • 绍兴网站seo磁力天堂最新版地址
  • 网站开发安全需求凡科网建站系统源码
  • 哪些香港主机做wordpress好乐山网站seo
  • 京东电子商务网站建设目的企业网站优化服务公司
  • 阿里网站建设谷歌google中文登录入口
  • 网站访客qq号码获取优化方案英语
  • dedecms 手机网站今日武汉最新消息
  • java做网站评论怎么做怎么建立信息网站平台
  • 集团做网站方案制作包含哪些方面网页设计与制作软件有哪些
  • 丛台专业做网站发帖子最好的几个网站
  • 怎么免费搭建属于自己的网站跨境电商有哪些平台
  • 影院网站如何做站长工具之家
  • 免费制作网站的步骤 怎样做网站网络营销工具
  • 网站建设需求问卷产品如何做市场推广
  • 政府网站开发项目书网络公司网络推广服务
  • 云空间网站2021年年度关键词排名
  • 国家和住房城乡建设部网站首页百度广告投放平台
  • 网站模板中心 网站推荐免费注册个人网站不花钱
  • 成都网站建设科技公司百度客服中心人工在线咨询
  • 低价网站建设多少钱杭州网站建设 seo
  • 企业网站cms源码cpu优化软件
  • 福州网站建设机构企业seo的措施有哪些
  • 集团网站开发360站长平台
  • logo模板素材六年级下册数学优化设计答案
  • 阿里云如何搭建网站搜索引擎优化的基本原理
  • dreamweaver怎么制作网站谷歌seo课程
  • 中堂仿做网站足球世界排名
  • 广州品牌网站建设网站的网络推广
  • wordpress post data做网络优化哪家公司比较好
  • 做网批有专门的网站吗市场策划方案