LeetCode2444: 统计定界子数组的数目

这篇具有很好参考价值的文章主要介绍了LeetCode2444: 统计定界子数组的数目。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

作者推荐

【二叉树】【单调双向队列】LeetCode239:滑动窗口最大值

题目

给你一个整数数组 nums 和两个整数 minK 以及 maxK 。
nums 的定界子数组是满足下述条件的一个子数组:
子数组中的 最小值 等于 minK 。
子数组中的 最大值 等于 maxK 。
返回定界子数组的数目。
子数组是数组中的一个连续部分。
示例 1:
输入:nums = [1,3,5,2,7,5], minK = 1, maxK = 5
输出:2
解释:定界子数组是 [1,3,5] 和 [1,3,5,2] 。
示例 2:
输入:nums = [1,1,1,1], minK = 1, maxK = 1
输出:10
解释:nums 的每个子数组都是一个定界子数组。共有 10 个子数组。
参数范围
2 <= nums.length <= 105
1 <= nums[i], minK, maxK <= 106

分析

时间复杂度: O(n) 枚举每个子数组的终点,求左边界的范围。假定i是右边界。

iMinMin 是从nums[0,i]中从右向左第一个小于minK的下标
iMaxMax 是从nums[0,i]中从右向左第一个大于maxK的下标
iEndMin 是从nums[0,i]中从右向左第一个等于minK的下标
iEndMax 是从nums[0,i]中从右向左第一个等于maxK的下标

显然left > max(iMinMin ,iMaxMax) 否则最小值更小或最大值更大
left <= min(iEndMin,iEndMax) 否则不存在minK或maxK。

代码

核心代码

class Solution {
public:
	long long countSubarrays(vector<int>& nums, int minK, int maxK) {
		int iMinMin = -1, iMaxMax = -1;
		int iEndMin = -1, iEndMax = -1;
		long long llRet = 0;
		for (int i = 0; i < nums.size(); i++)
		{			
			const auto& n = nums[i];
			if (n > maxK)
			{
				iMaxMax = i;
			}
			if (n < minK)
			{
				iMinMin = i;
			}
			if (n == maxK)
			{
				iEndMax = i;
			}
			if (n == minK)
			{
				iEndMin = i;
			}
			const int cur = min(iEndMin, iEndMax) - max(iMinMin, iMaxMax);
			if (cur > 0)
			{
				llRet += cur;
			}
		}
		return llRet;
	}
};

测试用例

template<class T>
void Assert(const T& t1, const T& t2)
{
	assert(t1 == t2);
}

template<class T>
void Assert(const vector<T>& v1, const vector<T>& v2)
{
	if (v1.size() != v2.size())
	{
		assert(false);
		return;
	}
	for (int i = 0; i < v1.size(); i++)
	{
		Assert(v1[i], v2[i]);
	}
}
int main()
{
	vector<int> nums;
	int minK,  maxK;
	{
		Solution sln;
		nums = { 1, 3, 5, 2, 7, 5 }, minK = 1, maxK = 5;
		auto res = sln.countSubarrays(nums, minK, maxK);
		Assert(2LL, res);
	}
	{
		Solution sln;
		nums = { 1, 1, 1, 1 }, minK = 1, maxK = 1;
		auto res = sln.countSubarrays(nums, minK, maxK);
		Assert(10LL, res);
	}
}

2023年3月版

class Solution {
public:
	long long countSubarrays(const vector<int>& nums, const int minK, const int maxK) {
		int iInvalidIndex = -1;
		int iMinIndex = -1;
		int iMaxIndex = -1;
		long long llRet = 0;
		for (int i = 0; i < nums.size(); i++)
		{
			if (minK == nums[i])
			{
				iMinIndex = i;
			}
			if (maxK == nums[i])
			{
				iMaxIndex = i;
			}
			if ((nums[i] > maxK) || (nums[i] < minK))
			{
				iInvalidIndex = i;
			}
			int iCur = min(iMinIndex, iMaxIndex) - iInvalidIndex;
			if (iCur > 0)
			{
				llRet += iCur;
			}
		}
		return llRet;
	}
};

LeetCode2444: 统计定界子数组的数目,# 算法题,数据结构,算法,c++,leetcode,数学,子数组,数目

扩展阅读

视频课程

有效学习:明确的目标 及时的反馈 拉伸区(难度合适),可以先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771

如何你想快

速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

相关下载

想高屋建瓴的学习算法,请下载《喜缺全书算法册》doc版
https://download.csdn.net/download/he_zhidan/88348653

我想对大家说的话
闻缺陷则喜是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法C++ 实现。

LeetCode2444: 统计定界子数组的数目,# 算法题,数据结构,算法,c++,leetcode,数学,子数组,数目文章来源地址https://www.toymoban.com/news/detail-789597.html

到了这里,关于LeetCode2444: 统计定界子数组的数目的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 区间合并|LeetCode2963:统计好分割方案的数目

    【动态规划】【广度优先】LeetCode2258:逃离火灾 区间合并 给你一个下标从 0 开始、由 正整数 组成的数组 nums。 将数组分割成一个或多个 连续 子数组,如果不存在包含了相同数字的两个子数组,则认为是一种 好分割方案 。 返回 nums 的 好分割方案 的 数目。 由于答案可能很

    2024年02月03日
    浏览(44)
  • 【图论】【分类讨论】LeetCode3017按距离统计房屋对数目

    图论 分类讨论 【差分数组】【图论】【分类讨论】【整除以2】3017按距离统计房屋对数目 给你三个 正整数 n 、x 和 y 。 在城市中,存在编号从 1 到 n 的房屋,由 n 条街道相连。对所有 1 = i n ,都存在一条街道连接编号为 i 的房屋与编号为 i + 1 的房屋。另存在一条街道连接编

    2024年04月13日
    浏览(32)
  • 【差分数组】【图论】【分类讨论】【整除以2】100213按距离统计房屋对数目

    【动态规划】【数学】【C++算法】18赛车 差分数组 图论 分类讨论 整除以2 给你三个 正整数 n 、x 和 y 。 在城市中,存在编号从 1 到 n 的房屋,由 n 条街道相连。对所有 1 = i n ,都存在一条街道连接编号为 i 的房屋与编号为 i + 1 的房屋。另存在一条街道连接编号为 x 的房屋与

    2024年01月22日
    浏览(37)
  • 2023-08-23 LeetCode每日一题(统计点对的数目)

    点击跳转到题目位置 给你一个无向图,无向图由整数 n ,表示图中节点的数目,和 edges 组成,其中 edges[i] = [u i , v i ] 表示 u i 和 v i 之间有一条无向边。同时给你一个代表查询的整数数组 queries 。 第 j 个查询的答案是满足如下条件的点对 (a, b) 的数目: a b cnt 是与 a 或者 b

    2024年02月11日
    浏览(55)
  • 每日一题:leetcode 1448 统计二叉树中好节点的数目

    给你一棵根为  root  的二叉树,请你返回二叉树中好节点的数目。 「好节点」X 定义为:从根到该节点 X 所经过的节点中,没有任何节点的值大于 X 的值。 示例 1: 示例 2: 示例 3: 提示: 二叉树中节点数目范围是  [1, 10^5]  。 每个节点权值的范围是  [-10^4, 10^4]  。 思路

    2024年02月11日
    浏览(41)
  • Leetcode每日一题:1448. 统计二叉树中好节点的数目

    给你一棵根为  root  的二叉树,请你返回二叉树中好节点的数目。 「好节点」X 定义为:从根到该节点 X 所经过的节点中,没有任何节点的值大于 X 的值。 示例 1: 示例 2: 示例 3: 提示: 二叉树中节点数目范围是  [1, 10^5]  。 每个节点权值的范围是  [-10^4, 10^4]  。 显然

    2024年02月11日
    浏览(37)
  • Leetcode每日一题:1782. 统计点对的数目(2023.8.24 C++)

    目录 1782. 统计点对的数目 题目描述: 实现代码与解析: hash + 双指针 原理思路:         给你一个无向图,无向图由整数  n   ,表示图中节点的数目,和  edges  组成,其中  edges[i] = [ui, vi]  表示  ui  和  vi  之间有一条无向边。同时给你一个代表查询的整数数组 

    2024年02月10日
    浏览(44)
  • 2023-08-25 LeetCode每日一题(统计二叉树中好节点的数目)

    点击跳转到题目位置 给你一棵根为 root 的二叉树,请你返回二叉树中好节点的数目。 「好节点」X 定义为:从根到该节点 X 所经过的节点中,没有任何节点的值大于 X 的值。 示例 1: 示例 2: 示例 3: 提示: 二叉树中节点数目范围是 [1, 10 5 ] 。 每个节点权值的范围是 [-10

    2024年02月11日
    浏览(36)
  • Leetcode每日一题:1448. 统计二叉树中好节点的数目(2023.8.25 C++)

    目录 1448. 统计二叉树中好节点的数目 题目描述: 实现代码与解析: dfs 原理思路:         给你一棵根为  root  的二叉树,请你返回二叉树中好节点的数目。 「好节点」X 定义为:从根到该节点 X 所经过的节点中,没有任何节点的值大于 X 的值。 示例 1: 示例 2: 示例

    2024年02月11日
    浏览(39)
  • LeetCode2670. 找出不同元素数目差数组:哈希表(预处理)

    力扣题目链接:https://leetcode.cn/problems/find-the-distinct-difference-array/ 给你一个下标从 0 开始的数组 nums ,数组长度为 n 。 nums 的 不同元素数目差 数组可以用一个长度为 n 的数组 diff 表示,其中 diff[i] 等于前缀 nums[0, ..., i] 中不同元素的数目 减去 后缀 nums[i + 1, ..., n - 1] 中不同元

    2024年02月21日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包