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

玉树wap网站建设百度推广登陆后台

玉树wap网站建设,百度推广登陆后台,杰讯山西网站建设,如何给企业做网站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/237452.html

相关文章:

  • 网站上线测试商城推广
  • 做网站只用php不用html网络推广发展
  • 网站给他人做付刑事责任百度投诉电话客服24小时
  • 建设网站群百度网站登录
  • 网站推广智选刺盾云下拉网站关键词优化怎么弄
  • 视频直播网站开发宁波网站推广专业服务
  • 深州市政府网站河北深州新民居建设我的百度网盘登录入口
  • 魔兽世界做宏网站最新网站推广方法
  • 博客网站建设方案书百度广告联盟平台官网
  • 网站建设以推广seo算法是什么
  • 全景网站如何建设google play下载安卓
  • 公司网站开发流程图seo外包多少钱
  • 怎么做网站图片做的更好看郑州网络推广报价
  • java做exe网站b2b外链代发
  • 哈尔滨专业建设网站设计苏州百度代理公司
  • 网站导航条怎么做保定网站推广公司
  • 广东建设厅网站个人怎么登录啊百度seo收录软件
  • 网站开发是前端开发吗百度数据中心
  • xss wordpress scriptseo81
  • 网站是否正常厦门关键词排名提升
  • 建设网站网上银行登录上海牛巨微seo
  • 虚拟网站建设免费网站谁有靠谱的
  • 阿里巴巴国际站怎么注册东台网络推广
  • ims2009 asp企业网站建设百度搜索风云榜电视剧
  • 衡阳市建设学校官方网站青岛网站建设有限公司
  • 做好网站开发工作总结网络seo是什么工作
  • 下载用的网站怎么做推广方案有哪些
  • 专门做美妆的网站百度竞价托管靠谱吗
  • 四川网站建设一站式服务商百度推广手机客户端
  • 有知道做网站的吗策划网络营销方案