【单调栈】LeetCode:2818操作使得分最大

news2025/2/28 13:19:13

作者推荐

map|动态规划|单调栈|LeetCode975:奇偶跳

涉及知识点

单调栈

题目

给你一个长度为 n 的正整数数组 nums 和一个整数 k 。
一开始,你的分数为 1 。你可以进行以下操作至多 k 次,目标是使你的分数最大:
选择一个之前没有选过的 非空 子数组 nums[l, …, r] 。
从 nums[l, …, r] 里面选择一个 质数分数 最高的元素 x 。如果多个元素质数分数相同且最高,选择下标最小的一个。
将你的分数乘以 x 。
nums[l, …, r] 表示 nums 中起始下标为 l ,结束下标为 r 的子数组,两个端点都包含。
一个整数的 质数分数 等于 x 不同质因子的数目。比方说, 300 的质数分数为 3 ,因为 300 = 2 * 2 * 3 * 5 * 5 。
请你返回进行至多 k 次操作后,可以得到的 最大分数 。
由于答案可能很大,请你将结果对 109 + 7 取余后返回。
示例 1:
输入:nums = [8,3,9,3,8], k = 2
输出:81
解释:进行以下操作可以得到分数 81 :

  • 选择子数组 nums[2, …, 2] 。nums[2] 是子数组中唯一的元素。所以我们将分数乘以 nums[2] ,分数变为 1 * 9 = 9 。
  • 选择子数组 nums[2, …, 3] 。nums[2] 和 nums[3] 质数分数都为 1 ,但是 nums[2] 下标更小。所以我们将分数乘以 nums[2] ,分数变为 9 * 9 = 81 。
    81 是可以得到的最高得分。
    示例 2:
    输入:nums = [19,12,14,6,10,18], k = 3
    输出:4788
    解释:进行以下操作可以得到分数 4788 :
  • 选择子数组 nums[0, …, 0] 。nums[0] 是子数组中唯一的元素。所以我们将分数乘以 nums[0] ,分数变为 1 * 19 = 19 。
  • 选择子数组 nums[5, …, 5] 。nums[5] 是子数组中唯一的元素。所以我们将分数乘以 nums[5] ,分数变为 19 * 18 = 342 。
  • 选择子数组 nums[2, …, 3] 。nums[2] 和 nums[3] 质数分数都为 2,但是 nums[2] 下标更小。所以我们将分数乘以 nums[2] ,分数变为 342 * 14 = 4788 。
    4788 是可以得到的最高的分。
    参数范围
    1 <= nums.length == n <= 105
    1 <= nums[i] <= 105
    1 <= k <= min(n * (n + 1) / 2, 109)

单调栈

时间复杂度😮(nlogn)
静态变量vPrime 记录所有质数。
vPriCount 记录nums各数的质量分数。vPriCount也可以弄成静态成员变量。
我们枚举各子数组的最大质量分数,如果有多个最大质量分数,取下标最小的。即:
left为从右向左第一个大于等于vPriCount[i]的下标,不存在为-1。
right为从左向右第一个大于vPriCount[i]的下标,不存在为m_c。
子数组(li,ri)就是符合条件的子数组,li取值范围(left,i],ri取值范围[i,right)。
我们按的nums[i]降序操作 最大质量分数为vPriCount[i]的子数组。

代码

核心代码

class CRangIndex
{
public:
	template<class _Pr>
	CRangIndex(const vector<int>& nums, _Pr CurIndexCmpStackTopIndex)
	{
		m_c = nums.size();
		m_vLeft.assign(m_c, -1);
		m_vRight.assign(m_c, m_c);
		stack<int> sta;
		for (int i = 0; i < m_c; i++)
		{
			while (sta.size() && (CurIndexCmpStackTopIndex(i, sta.top())))
			{
				m_vRight[sta.top()] = i;
				sta.pop();
			}
			if (sta.size())
			{
				m_vLeft[i] = sta.top();
			}
			sta.emplace(i);
		}
	}
	int m_c;
	vector<int> m_vLeft, m_vRight;//vLeft[i] 从右向左第一个小于nums[i] ;vRight[i] 是第一个小于等于nums[i]。
};

vector<int> CreatePrime(int iMax)
{
	vector<int> vPrime = { 2 };
	for (int i = 3; i <= iMax; i++)
	{
		bool b = true;
		for (const auto& n : vPrime)
		{
			if (0 == i % n)
			{
				b = false;
				break;
			}
		}
		if (b)
		{
			vPrime.emplace_back(i);
		}
	}
	return vPrime;
}

template<int MOD = 1000000007>
class C1097Int
{
public:
	C1097Int(long long llData = 0) :m_iData(llData% MOD)
	{

	}
	C1097Int  operator+(const C1097Int& o)const
	{
		return C1097Int(((long long)m_iData + o.m_iData) % MOD);
	}
	C1097Int& operator+=(const C1097Int& o)
	{
		m_iData = ((long long)m_iData + o.m_iData) % MOD;
		return *this;
	}
	C1097Int& operator-=(const C1097Int& o)
	{
		m_iData = (m_iData + MOD - o.m_iData) % MOD;
		return *this;
	}
	C1097Int  operator-(const C1097Int& o)
	{
		return C1097Int((m_iData + MOD - o.m_iData) % MOD);
	}
	C1097Int  operator*(const C1097Int& o)const
	{
		return((long long)m_iData * o.m_iData) % MOD;
	}
	C1097Int& operator*=(const C1097Int& o)
	{
		m_iData = ((long long)m_iData * o.m_iData) % MOD;
		return *this;
	}
	bool operator<(const C1097Int& o)const
	{
		return m_iData < o.m_iData;
	}
	C1097Int pow(long long n)const
	{
		C1097Int iRet = 1, iCur = *this;
		while (n)
		{
			if (n & 1)
			{
				iRet *= iCur;
			}
			iCur *= iCur;
			n >>= 1;
		}
		return iRet;
	}
	C1097Int PowNegative1()const
	{
		return pow(MOD - 2);
	}
	int ToInt()const
	{
		return m_iData;
	}
private:
	int m_iData = 0;;
};

class Solution {
public:
	int maximumScore(vector<int>& nums, int k) {
		m_c = nums.size();
		
		vector<int> vPriCount;
		{
			static vector<int> vPrime = CreatePrime(1000 * 100);
			for (const auto& n : nums)
			{
				int tmp = n;
				int iNum = 0;
				for (const auto& pr : vPrime)
				{
					if (pr * pr > tmp)
					{
						break;
					}
					if (0 == tmp % pr)
					{
						while (0 == tmp % pr)
						{
							tmp /= pr;
						}
						iNum++;
					}
				}
				vPriCount.emplace_back(iNum + (tmp > 1));
			}
		}
		
		CRangIndex ri(vPriCount, [&](int i1, int i2) {return vPriCount[i1] > vPriCount[i2]; });
		std::multimap<int, int, greater<int>> mValueIndex;
		for (int i = 0; i < ri.m_c; i++)
		{
			mValueIndex.emplace(nums[i], i);
		}
		C1097Int<> biRet=1;
		for (const auto& [value, i] : mValueIndex)
		{
			const long long llSubArrCount = ((long long)i - ri.m_vLeft[i]) * (ri.m_vRight[i] - i);
			const long long llOpeCount = min((long long)k, llSubArrCount);

			biRet *= C1097Int<>(value).pow(llOpeCount);
			k -= llOpeCount;
			if (0 == k)
			{
				break;
			}
		}
		return biRet.ToInt();
	}
	int m_c;
};

测试用例

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 k;
	{
		Solution slu;
		nums = { 8, 3, 9, 3, 8 };
		k = 2;
		auto res = slu.maximumScore(nums, k);
		Assert(81, res);
	}
	{
		Solution slu;
		nums = { 19,12,14,6,10,18 };
		k = 3;
		auto res = slu.maximumScore(nums, k);
		Assert(4788, res);
	}
	
	//CConsole::Out(res);
}

2023年8月

template<int MOD = 1000000007>
class C1097Int
{
public:
	C1097Int(long long llData = 0) :m_iData(llData% MOD)
	{

	}
	C1097Int  operator+(const C1097Int& o)const
	{
		return C1097Int(((long long)m_iData + o.m_iData) % MOD);
	}
	C1097Int& operator+=(const C1097Int& o)
	{
		m_iData = ((long long)m_iData + o.m_iData) % MOD;
		return *this;
	}
	C1097Int& operator-=(const C1097Int& o)
	{
		m_iData = (m_iData + MOD - o.m_iData) % MOD;
		return *this;
	}
	C1097Int  operator-(const C1097Int& o)
	{
		return C1097Int((m_iData + MOD - o.m_iData) % MOD);
	}
	C1097Int  operator*(const C1097Int& o)const
	{
		return((long long)m_iData * o.m_iData) % MOD;
	}
	C1097Int& operator*=(const C1097Int& o)
	{
		m_iData = ((long long)m_iData * o.m_iData) % MOD;
		return *this;
	}
	bool operator<(const C1097Int& o)const
	{
		return m_iData < o.m_iData;
	}
	C1097Int pow(int n)const
	{
		C1097Int iRet = 1, iCur = *this;
		while (n)
		{
			if (n & 1)
			{
				iRet *= iCur;
			}
			iCur *= iCur;
			n >>= 1;
		}
		return iRet;
	}
	C1097Int PowNegative1()const
	{
		return pow(MOD - 2);
	}
	int ToInt()const
	{
		return m_iData;
	}
private:
	int m_iData = 0;;
};

template<int MOD = 1000000007>
int operator+(int iData, const C1097Int<MOD>& int1097)
{
	int iRet = int1097.operator+(C1097Int<MOD>(iData)).ToInt();
	return iRet;
}

template<int MOD = 1000000007>
int& operator+=(int& iData, const C1097Int<MOD>& int1097)
{
	iData = int1097.operator+(C1097Int<MOD>(iData)).ToInt();
	return iData;
}

template<int MOD = 1000000007>
int operator*(int iData, const C1097Int<MOD>& int1097)
{
	int iRet = int1097.operator*(C1097Int(iData)).ToInt();
	return iRet;
}

template<int MOD = 1000000007>
int& operator*=(int& iData, const C1097Int<MOD>& int1097)
{
	iData = int1097.operator*(C1097Int(iData)).ToInt();
	return iData;
}

class Solution {
public:
	int maximumScore(vector<int>& nums, int k) {
		m_c = nums.size();
		vector<int> vScore;
		for ( int n : nums)
		{
			int iScore = 0;
			for (int i = 2; i * i <= n; i++)
			{
				if (0 != n % i)
				{
					continue;
				}
				iScore++;
				while (0 == n % i)
				{
					n /= i;
				}
			}
			if (n > 1)
			{
				iScore++;
			}
			vScore.emplace_back(iScore);
		}

		stack<int> sta;
		vector<int> vLeft(m_c), vRight(m_c, m_c);
		for (int i = 0 ; i < m_c ; i++ )
		{
			while (sta.size() && (vScore[sta.top()] < vScore[i]))
			{
				vRight[sta.top()] = i;
				sta.pop();
			}
			vLeft[i] = sta.size() ? sta.top() : -1;
			sta.emplace(i);			
		}

		std::map<int, long long,std::greater<int>> mValueNum;
		for (int i = 0; i < m_c; i++)
		{
			mValueNum[nums[i]] += (i - vLeft[i])*(long long)(vRight[i] - i);
		}
		C1097Int<> biRet = 1;
		while (k > 0)
		{
			for (auto it : mValueNum)
			{
				long long llMulMul = min((long long)k, it.second);
				k -= llMulMul;
				auto cur = C1097Int<>(it.first).pow((int)llMulMul);
				biRet *= cur;
			}
		}
		return biRet.ToInt();
	}
	int m_c;
};

使用封装类后



template<int MOD = 1000000007>
class C1097Int
{
public:
	C1097Int(long long llData = 0) :m_iData(llData% MOD)
	{

	}
	C1097Int  operator+(const C1097Int& o)const
	{
		return C1097Int(((long long)m_iData + o.m_iData) % MOD);
	}
	C1097Int& operator+=(const C1097Int& o)
	{
		m_iData = ((long long)m_iData + o.m_iData) % MOD;
		return *this;
	}
	C1097Int& operator-=(const C1097Int& o)
	{
		m_iData = (m_iData + MOD - o.m_iData) % MOD;
		return *this;
	}
	C1097Int  operator-(const C1097Int& o)
	{
		return C1097Int((m_iData + MOD - o.m_iData) % MOD);
	}
	C1097Int  operator*(const C1097Int& o)const
	{
		return((long long)m_iData * o.m_iData) % MOD;
	}
	C1097Int& operator*=(const C1097Int& o)
	{
		m_iData = ((long long)m_iData * o.m_iData) % MOD;
		return *this;
	}
	bool operator<(const C1097Int& o)const
	{
		return m_iData < o.m_iData;
	}
	C1097Int pow(long long n)const
	{
		C1097Int iRet = 1, iCur = *this;
		while (n)
		{
			if (n & 1)
			{
				iRet *= iCur;
			}
			iCur *= iCur;
			n >>= 1;
		}
		return iRet;
	}
	C1097Int PowNegative1()const
	{
		return pow(MOD - 2);
	}
	int ToInt()const
	{
		return m_iData;
	}
private:
	int m_iData = 0;;
};

class CRangIndex
{
public:
	template<class _Pr>
	CRangIndex(int iVectorSize, _Pr CurIndexCmpStackTopIndex)
	{
		m_c = iVectorSize;
		m_vLeft.assign(m_c, -1);
		m_vRight.assign(m_c, m_c);
		stack<int> sta;
		for (int i = 0; i < m_c; i++)
		{
			while (sta.size() && (CurIndexCmpStackTopIndex(i, sta.top())))
			{
				m_vRight[sta.top()] = i;
				sta.pop();
			}
			if (sta.size())
			{
				m_vLeft[i] = sta.top();
			}
			sta.emplace(i);
		}
	}

	template<class _Pr>
	CRangIndex(const vector<int>& nums, _Pr CurValueCmpStackTopValue)
	{
		m_c = nums.size();
		m_vLeft.assign(m_c, -1);
		m_vRight.assign(m_c, m_c);
		stack<int> sta;
		for (int i = 0; i < m_c; i++)
		{
			while (sta.size() && (CurValueCmpStackTopValue(nums[i], nums[sta.top()])))
			{
				m_vRight[sta.top()] = i;
				sta.pop();
			}
			if (sta.size())
			{
				m_vLeft[i] = sta.top();
			}
			sta.emplace(i);
		}
	}
	int m_c;
	vector<int> m_vLeft, m_vRight;//vLeft[i] 从右向左第一个小于nums[i] ;vRight[i] 是第一个小于等于nums[i]。
};

vector<int> CreatePrime(int iMax)
{
	vector<int> vPrime = { 2 };
	for (int i = 3; i <= iMax; i++)
	{
		bool b = true;
		for (const auto& n : vPrime)
		{
			if (0 == i % n)
			{
				b = false;
				break;
			}
		}
		if (b)
		{
			vPrime.emplace_back(i);
		}
	}
	return vPrime;
}
class Solution {
public:
	int maximumScore(vector<int>& nums, int k) {
		m_c = nums.size();
		
		vector<int> vPriCount;
		{
			static vector<int> vPrime = CreatePrime(1000 * 100);
			for (const auto& n : nums)
			{
				int tmp = n;
				int iNum = 0;
				for (const auto& pr : vPrime)
				{
					if (pr * pr > tmp)
					{
						break;
					}
					if (0 == tmp % pr)
					{
						while (0 == tmp % pr)
						{
							tmp /= pr;
						}
						iNum++;
					}
				}
				vPriCount.emplace_back(iNum + (tmp > 1));
			}
		}
		
		CRangIndex ri(vPriCount, std::greater<>());
		std::multimap<int, int, greater<int>> mValueIndex;
		for (int i = 0; i < ri.m_c; i++)
		{
			mValueIndex.emplace(nums[i], i);
		}
		C1097Int<> biRet=1;
		for (const auto& [value, i] : mValueIndex)
		{
			const long long llSubArrCount = ((long long)i - ri.m_vLeft[i]) * (ri.m_vRight[i] - i);
			const long long llOpeCount = min((long long)k, llSubArrCount);

			biRet *= C1097Int<>(value).pow(llOpeCount);
			k -= llOpeCount;
			if (0 == k)
			{
				break;
			}
		}
		return biRet.ToInt();
	}
	int m_c;
};

扩展阅读

视频课程

有效学习:明确的目标 及时的反馈 拉伸区(难度合适),可以先学简单的课程,请移步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++ 实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1330217.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Springboot的酒店管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的酒店管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&…

阅读笔记-A Cluster Separation Measure

A Cluster Separation Measure&#xff08;一种聚类分离测度&#xff09; 1.这篇论文要解决什么问题&#xff1f;要验证一个什么科学假设&#xff1f; 问题是确定数据中聚类的适当数量&#xff0c;解决这种问题的两种方法都取决于确定指数中相对较大的变化&#xff0c;而不是…

免费PHP完美运营的最新短视频打赏系统学习版

免费PHP完美运营的最新短视频打赏系统学习版 一、介绍 免费PHP完美运营的最新短视频打赏系统学习版&#xff0c;是一款基于PHP开发的打赏系统&#xff0c;具有强大的功能和稳定的性能。相比于市面上的其他打赏系统&#xff0c;它更加完善&#xff0c;几乎无bug&#xff0c;能…

Socket.D 基于消息的响应式应用层网络协议

首先根据 Socket.D 官网 的副标题&#xff0c;Socket.D 的自我定义是&#xff1a; 基于事件和语义消息流的网络应用协议。官网定义的特点是&#xff1a; 基于事件&#xff0c;每个消息都可事件路由所谓语义&#xff0c;通过元信息进行语义描述流关联性&#xff0c;有相关的消…

《数字图像处理-OpenCV/Python》连载:图像的阈值处理

《数字图像处理-OpenCV/Python》连载&#xff1a;图像的阈值处理 本书京东 优惠购书链接 https://item.jd.com/14098452.html 本书CSDN 独家连载专栏 https://blog.csdn.net/youcans/category_12418787.html 第 9 章 图像的阈值处理 图像的阈值处理简单、直观&#xff0c;计算…

ES-mapping

类似数据库中的表结构定义&#xff0c;主要作用如下 定义Index下的字段名( Field Name) 定义字段的类型&#xff0c;比如数值型、字符串型、布尔型等定义倒排索引相关的配置&#xff0c;比如是否索引、记录 position 等 index_options 用于控制倒排索记录的内容&#xff0c;有如…

【PWN学习】cannary绕过方式汇总

背景 利用cannary解题在现在的CTF比赛中似乎已经过时了&#xff0c;只是为了学习了解一下。 绕过的4种方式 目前我了解到的方式主要有以下4种 forksspstack_chk_failTLS canary attack fork 每次进程重启后的Canary是不同的&#xff0c;但是同一个进程中的Canary都是一样…

探秘JDK 10:崭新特性悉数解析

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 探秘JDK 10&#xff1a;崭新特性悉数解析 前言局部变量类型推断(var关键字)线程本地握手背景和用途&#xff1a;如何使用&#xff1a;优势&#xff1a; 改进的option集合工厂方法List.of() 方法&#…

化繁为简,Python快速入门,从基础到实践的学习。

文章目录 前言一、安装与运行命令行运行 python 文件 二、变量和简单数据类型2.1 变量命名规则2.2 字符串2.2.1 字符串的简单运算title()upper()、lower() 2.2.2 合并&#xff08;拼接&#xff09;字符串2.2.3 使用制表符或换行符来添加空白2.2.4 删除空白2.2.5 Python 2 中的 …

Arduino开发实例-APDS-9930环境光和趋近传感器驱动

APDS-9930环境光和趋近传感器驱动 文章目录 APDS-9930环境光和趋近传感器驱动1、APDS-9930介绍2、硬件准备及接线3、驱动实现1、APDS-9930介绍 APDS-9930模块由环境光、红外线和接近传感器组成。 检测距离可达 100 毫米。 APDS-9930 传感器测量环境光。 该传感器还可以在黑暗中…

trino-435版本windows下源码编译

一、源码下载地址 https://github.com/trinodb/trino/tags 二、编译环境及工具准备 1、maven &#xff08;1&#xff09;版本&#xff1a;3.6.3 &#xff08;2&#xff09;settings.xml配置 <?xml version"1.0" encoding"UTF-8"?> <settin…

融资项目——vue之事件监听

vue通过v-on进行事件监听&#xff0c;在标签中使用v-on:xxx&#xff08;事件名称&#xff09;进行监听&#xff0c;事件触发的相应方法定义在Vue对象中的methods中。如下图所示&#xff1a; 上述代码对按钮进行监听&#xff0c;点击按钮后就会触发solve函数。

2016年第五届数学建模国际赛小美赛C题对超级细菌的战争解题全过程文档及程序

2016年第五届数学建模国际赛小美赛 C题 对超级细菌的战争 原题再现&#xff1a; 最近有很多关于我们抗生素耐药性危机的讨论。进化出的能够抵抗抗生素的细菌每年杀死70万人&#xff0c;越来越强大的细菌正在世界各地传播。研究人员担心&#xff0c;我们将进入一个后抗生素时代…

分子动力学模拟

天玑算科研服务_模拟计算_超算租用_实验测试天玑算科研服务致力于营造良好科研生态环境&#xff0c;加速科研成果转换&#xff0c;500余位TOP高校博士计算工程师团队&#xff0c;涉及第一性原理、分子动力学模拟、有限元等领域&#xff0c;为电池、能源、化工、生物医药等领域提…

尚硅谷图解Java设计模式

尚硅谷图解Java设计模式 第 1 章 内容介绍和授课方式Java 设计模式内容介绍先看几个经典的面试题设计模式的重要性 课程亮点和授课方式 第 2 章 设计模式七大原则设计模式的目的设计模式七大原则单一职责原则基本介绍应用实例单一职责原则注意事项和细节 接口隔离原则(Interfac…

HarmonyOS构建第一个ArkTS应用(FA模型)

构建第一个ArkTS应用&#xff08;FA模型&#xff09; 创建ArkTS工程 若首次打开DevEco Studio&#xff0c;请点击Create Project创建工程。如果已经打开了一个工程&#xff0c;请在菜单栏选择File > New > Create Project来创建一个新工程。 选择Application应用开发&a…

18 Vue3中使用v-model绑定文本域

概述 使用v-model绑定文本域则属于不太常见的情况了&#xff0c;因为文本域一般会被富文本替代&#xff0c;而富文本的话一般又会引入一些第三方的富文本库&#xff0c;所以在真实的开发中&#xff0c;使用v-model绑定文本域的场景实际上并不多见。 这里&#xff0c;我们了解…

如何在Windows上搭建WebDAV服务并通过内网穿透实现公网访问

文章目录 前言1. 安装IIS必要WebDav组件2. 客户端测试3. 使用cpolar内网穿透&#xff0c;将WebDav服务暴露在公网3.1 安装cpolar内网穿透3.2 配置WebDav公网访问地址 4. 映射本地盘符访问 前言 在Windows上如何搭建WebDav&#xff0c;并且结合cpolar的内网穿透工具实现在公网访…

安全、效率、成本:混合云数据库管理的三重挑战!

随着业务需求的不断演变&#xff0c;数据在多云平台之间流动&#xff0c;给数据库管控带来了新的层次和复杂性。这给数据库管控带来了前所未有的挑战。企业可能面临着一系列问题&#xff0c;包括安全性挑战、管理复杂性、性能与效率问题、成本控制难题、缺乏统一的管理视图以及…

C++ 链表

目录 链表结构 一&#xff0c;单链表 1.实现基本的增删查改 2.对链表进行一些操作 &#xff08;1&#xff09;删除等于给定值的所有节点。 &#xff08;2&#xff09;翻转链表 &#xff08;3&#xff09; 返回中间节点的地址 &#xff08;4&#xff09;倒数第k个节点 &…