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

算法学习打卡day47|单调栈系列题目

单调栈题目思路

  • 通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了。时间复杂度为O(n)。
  • 单调栈的本质是空间换时间,因为在遍历的过程中需要用一个栈来记录右边第一个比当前元素高的元素,优点是整个数组只需要遍历一次。
单调栈解题步骤
  1. 建立一个栈,然后从头遍历元素。
  2. 既然为单调栈,那么肯定分为单调递增栈和单调递减栈(这里的单调递增或者递减指的是从栈顶到栈底方向),这里单调栈递增(从栈口到栈底顺序),就是求右边第一个比自己大的,单调栈递减的话,就是求右边第一个比自己小的。 那么分为两种情况:
    • 如果是单调递增栈时,当栈为空或者当前元素值小于栈顶元素时,执行push操作,此时的栈从栈顶到栈底为单调递增,而当前元素值大于栈顶元素值时,不符合单调递增,此时当前元素就是栈顶元素的右侧第一个比它大的元素,输出结果即可(注意这里要循判断栈顶元素是否都符合情况),当然左侧比自己大的元素就是当前栈顶的下一个元素了
    • 如果是单调递减栈时,同样的思路,当栈为空或者当前元素值大于栈顶元素时,执行push操作,此时的栈从栈顶到栈底为单调递减,而当前元素值小于栈顶元素值时,不符合单调递减,此时当前元素就是栈顶元素的右侧第一个比它小的元素,输出结果即可(注意这里要循判断栈顶元素是否都符合情况),当然左侧比自己小的元素就是当前栈顶的下一个元素了(接雨水和求柱子最大面积会用)
  • 注意:
    • 这里其实在元素等于栈顶元素的时候可以和另一个步骤合并,而不影响计算结果。
    • 单调栈解题,一般都是存数组下标,数组元素可以下标访问,很方便。

每日温度

力扣题目链接
题目描述:
给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。
示例 1:
输入: temperatures = [73,74,75,71,69,72,76,73]
输出: [1,1,4,2,1,1,0,0]
示例 2:

输入: temperatures = [30,40,50,60]
输出: [1,1,1,0]
思路:

  • 从题目可以直接看到要求下一个更高温度在几天后,很显然就是求右边第一个比自己大的元素位置减去当前位置下标即位所求,直接使用单调栈来解题,很显然这道题时单调递增栈(从栈顶到栈底)。

代码实现:

class Solution {
public:vector<int> dailyTemperatures(vector<int>& temperatures) {vector<int> result(temperatures.size(), 0);stack<int> stk;for (int i = 0; i < temperatures.size(); ++i) {while (!stk.empty() && temperatures[i] > temperatures[stk.top()]) {int tmp = stk.top();result[tmp] = i - tmp;stk.pop();}stk.push(i);}return result;  }
};

下一个最大元素一

力扣题目链接
题目描述:
nums1 中数字 x 的 下一个更大元素 是指 x 在 nums2 中对应位置 右侧 的 第一个 比 x 大的元素。

给你两个 没有重复元素 的数组 nums1 和 nums2 ,下标从 0 开始计数,其中nums1 是 nums2 的子集。

对于每个 0 <= i < nums1.length ,找出满足 nums1[i] == nums2[j] 的下标 j ,并且在 nums2 确定 nums2[j] 的 下一个更大元素 。如果不存在下一个更大元素,那么本次查询的答案是 -1 。

返回一个长度为 nums1.length 的数组 ans 作为答案,满足 ans[i] 是如上所述的 下一个更大元素 。
示例 1:

输入:nums1 = [4,1,2], nums2 = [1,3,4,2].
输出:[-1,3,-1]
解释:nums1 中每个值的下一个更大元素如下所述:

  • 4 ,用加粗斜体标识,nums2 = [1,3,4,2]。不存在下一个更大元素,所以答案是 -1 。
  • 1 ,用加粗斜体标识,nums2 = [1,3,4,2]。下一个更大元素是 3 。
  • 2 ,用加粗斜体标识,nums2 = [1,3,4,2]。不存在下一个更大元素,所以答案是 -1 。
    示例 2:

输入:nums1 = [2,4], nums2 = [1,2,3,4].
输出:[3,-1]
解释:nums1 中每个值的下一个更大元素如下所述:

  • 2 ,用加粗斜体标识,nums2 = [1,2,3,4]。下一个更大元素是 3 。
  • 4 ,用加粗斜体标识,nums2 = [1,2,3,4]。不存在下一个更大元素,所以答案是 -1 。

思路:

  • 本题和每日温度类似,但是是在另一个数组里找,其实是一样的,我们可以用一个哈希map记录nums1的元素和下标映射关系,然后通过单调栈的方式去找nums2中每个元素的右侧最大值,当遇到符合条件的时候,就到map里找一下是否存在nums2里的这个元素,存在的话,就对应输出即可。

代码实现:

class Solution {
public:vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {vector<int> result(nums1.size(), -1);unordered_map<int, int> map;for (int i = 0; i < nums1.size(); ++i) {map.insert(pair<int, int>{nums1[i], i});}stack<int> stk;for (int i = 0; i < nums2.size(); ++i) {//int num = nums2[i];while (!stk.empty() && nums2[i] > stk.top()) {if (map.count(stk.top())) {result[map[stk.top()]] = nums2[i];}stk.pop();}stk.push(nums2[i]);}return result;}
};

下一个最大元素二

力扣题目链接
题目描述:
给定一个循环数组 nums ( nums[nums.length - 1] 的下一个元素是 nums[0] ),返回 nums 中每个元素的 下一个更大元素 。

数字 x 的 下一个更大的元素 是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1 。

示例 1:
输入: nums = [1,2,1]
输出: [2,-1,2]
解释: 第一个 1 的下一个更大的数是 2;
数字 2 找不到下一个更大的数;
第二个 1 的下一个最大的数需要循环搜索,结果也是 2。

示例 2:
输入: nums = [1,2,3,4,3]
输出: [2,3,4,-1,4]

思路:

  • 和上一个题类似,但是这次是循环数组,那么一般遇到循环数组的时候,我们没必要去把原数组拼接一次,直接让下标可以增长到2*n即可,在访问元素的时候对下标取余操作就不会越界。
  • 其他步骤就是单调栈的解题模板,注意这里可以剪枝一下,如果第一轮已经处理过的就不用再push一次了,没处理过的push即可。

代码实现:

class Solution {
public:vector<int> nextGreaterElements(vector<int>& nums) {int n = nums.size();stack<int> stk;vector<int> result(n, -1);for (int i = 0; i < 2 * n; ++i) {//上界为2n时,循环的时候模拟循环数组while (!stk.empty() && nums[i % n] > nums[stk.top()]) {result[stk.top()] = nums[i % n];stk.pop();}if (result[i % n] == -1) stk.push(i % n);//剪枝,之前已经处理过的可以不用push了。}return result;}
};

接雨水

力扣题目链接
题目描述:
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
在这里插入图片描述

示例 1:
输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]
输出:6
解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。

示例 2:
输入:height = [4,2,0,3,2,5]
输出:9

提示:

n == height.length
1 <= n <= 2 * 104
0 <= height[i] <= 105

思路:

  • 题目解读:若干个柱子,用凹槽去接雨水,这里是去求凹槽的面积之和,有两种思路:
    1. 按列计算(暴力解法),遍历每个元素,求出该元素能接的雨水高度,然后求和,这种情况需要分别求左右两侧比自己高的元素中的最大值,比如下图中的第6列,左侧比自己高的的最高柱子为第4列,右侧是第8列,那么第6列接雨水的高度就是第4列和第8列中高度较小的那个,这里是2
      在这里插入图片描述

    2. 按行计算(单调栈解法),找出两边第一个比自己高的柱子,然后求出宽度,高度是两边柱子中的最小值减去当前柱子高度,比如还是第6列,此时左右两侧第一个比自己高的是第5和第7列,那么此时宽度就是7 - 5 - 1 = 1,高度是两者的最小值减去第6列的高度:1 - 0 = 1,这里两侧的高度刚好相等了,而如果是第5列的话,那么左右两侧分别是第4和第8列,那么宽度为8 - 4 - 1 = 3,高度为两者的最小值减去第5列的高度:2 - 1 = 1,然后面积就是高度宽度相乘。
      在这里插入图片描述
      代码实现

  • 暴力解法(时间复杂度为 O ( n 2 ) O(n^2) O(n2),力扣无法通过):
class Solution {
public:int trap(vector<int>& height) {int sum = 0;int lhigh = 0, rhigh = 0;for (int i = 1; i < height.size() - 1; ++i) {//找左边比它大的lhigh = height[i], rhigh = height[i];for (int j = i - 1; j >= 0; --j) {if (height[j] >= lhigh) {//注意这里找的是左边最大的那个,所以一直和lhigh比较lhigh = height[j];}}//找右边比它大的for (int k = i + 1; k < height.size(); ++k) {if (height[k] >= rhigh) {//注意这里找的是右边最大的那个,所以一直和rhigh比较rhigh = height[k];}}sum += min(rhigh, lhigh) - height[i];}return sum;}
};
  • 暴力解法优化:其实在找左右两侧最大值的时候有很多重复比较,我们其实直接取前面一个元素的结果和当前值做比较即可((为什么和当前值比较?如果没有比自己大的,就用当前值,那么算的时候高度差为0,就没有高度无法接雨水了)),在遍历数组之前,先把左右两侧比自己高的最大值找出来。
class Solution {
public:int trap(vector<int>& height) {int sum = 0;vector<int> l_max_vec(height.size(), 0);vector<int> r_max_vec(height.size(), 0);//直接把每个位置的左侧最高柱子都计算出来l_max_vec[0] = height[0];for (int i = 1; i < height.size(); ++i) {l_max_vec[i] = max(l_max_vec[i - 1], height[i]);}//直接把每个位置的右侧最高柱子都计算出来r_max_vec[height.size() - 1] = height[height.size() - 1];for (int j = height.size() - 2; j >= 0; --j) {r_max_vec[j] = max(r_max_vec[j + 1], height[j]);}//循环一次,直接计算即可。for (int i = 1; i < height.size() - 1; ++i) {  sum += min(l_max_vec[i], r_max_vec[i]) - height[i];}return sum;}
};
  • 单调栈解法(按行求解):
class Solution {
public:int trap(vector<int>& height) {stack<int> stk;int sum = 0;for (int i = 0; i < height.size(); ++i) {while (!stk.empty() && height[i] > height[stk.top()]) {int cur = stk.top();stk.pop();if (stk.empty())   break;int next = stk.top();//前面比它高的int high = min(height[i], height[next]) - height[cur];//高度差int weight = i - next - 1;//宽度sum += high * weight;//面积}stk.push(i);/*这里可以剪枝,如果相邻两个柱子高度相同算一个就行了,因为即使放进去,high计算的时候也是0*/}return sum;}
};

柱状图中最大的矩形

力扣题目链接
题目描述:
给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。

求在该柱状图中,能够勾勒出来的矩形的最大面积。

示例 1:
在这里插入图片描述

输入:heights = [2,1,5,6,2,3]
输出:10
解释:最大的矩形为图中红色区域,面积为 10

示例 2:
在这里插入图片描述

输入: heights = [2,4]
输出: 4

思路:

  • 和接雨水类似,但是本题更加复杂,接雨水是求凹槽,相当于是柱子外,本题是求柱子内的最大面积,**既然是求最大面积,那么本题需要找到的是每个柱子的左右两侧的第一个比自己小的那个柱子(注意这个题和前面四道题不一样了!!!,是求左右两侧比自己小的柱子,此时为栈顶到栈底单调递减),**这样的话用得到的宽度和当前柱子高度相乘即为已当前柱子为高度的矩形面积,然后依次对每个柱子求矩形面积取最大值即可。
  • 暴力解法:和接雨水不太一样,本题是找到左右两侧第一个比自己小的柱子(不再是找最小的柱子了(接雨水是找最大的柱子))
  • 注意:
    • 如果数组本身单调递增的话,那么入栈后整体呈现单调递减就找不到右侧比自己小的元素了,这种情况对于接雨水来说不用特殊处理(没有凹槽,雨水为0),但是本题不行,可以直接在原数组尾部加一个0,这样既不影响结果,也能找到了右侧比自己小的元素。
    • 对于数组单调递减的情况不用在数组开头添加元素,直接让left的高度设为-1即可。

代码实现

  • 单调栈解法:
class Solution {
public:int largestRectangleArea(vector<int>& heights) {int result = 0;stack<int> stk;heights.push_back(0);//单独处理,尾部加0for (int i = 0; i < heights.size(); ++i) {while (!stk.empty() && heights[i] < heights[stk.top()]) {int top = stk.top();stk.pop();int left = -1;//单独处理,left设为-1if (!stk.empty())    left = stk.top();int weight = i - left - 1;int s = heights[top] * weight;result = max(result, s);}stk.push(i);}return result;}
};
  • 暴力解法:
class Solution {
public:int largestRectangleArea(vector<int>& heights) {int result = INT_MIN;for (int i = 0; i < heights.size(); ++i) {int l_min = -1, r_min = heights.size();for (int j = i - 1; j >= 0; --j) {if (heights[j] < heights[i]) {l_min = j;break;}}for (int k = i + 1; k < heights.size(); ++k) {if (heights[k] < heights[i]) {r_min = k;break;}  }//cout << l_min << " " << r_min << endl;int weight = r_min - l_min - 1;int s = weight * heights[i];result = result > s ? result : s;}return result;}
};
  • 暴力解法优化:和接雨水优化类似,但是此处需要在for循环里用while循环去不断找到小于cur的柱子。(注意遇到等于的时候也要继续去找,当然也可以把等于逻辑拿出来单独写,其实是一样的)
class Solution {
public:int largestRectangleArea(vector<int>& heights) {int result = INT_MIN;vector<int> l_min_vec(heights.size(), -1);//默认没有比当前柱子小的vector<int> r_min_vec(heights.size(), heights.size());//默认没有比当前柱子小的//求左侧第一个小于当前高度的柱子for (int i = 1; i < heights.size(); ++i) {int t = i - 1;while (t >= 0 && heights[t] >= heights[i]) {t = l_min_vec[t];}//大于一直往左走l_min_vec[i] = t;//直到遍历到头或者小于的时候}//求右侧第一个小于当前高度的柱子for (int j = heights.size() - 2; j >= 0; --j) {int t = j + 1;while (t < heights.size() && heights[t] >= heights[j]) {t = r_min_vec[t];}//大于等于一直往右走r_min_vec[j] = t;//直到遍历到头或者小于的时候}//求面积for (int i = 0; i < heights.size(); ++i) {int weight = r_min_vec[i] - l_min_vec[i] - 1;int s = weight * heights[i];result = max(s, result);}return result;}
};

总结

  • 单调栈题目大体模版都是一样的,就是while里的处理逻辑可能不同,可以先熟悉暴力解法,然后看看和单调栈解法的区别在哪,妙在哪里。

相关文章:

算法学习打卡day47|单调栈系列题目

单调栈题目思路 通常是一维数组&#xff0c;要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置&#xff0c;此时我们就要想到可以用单调栈了。时间复杂度为O(n)。单调栈的本质是空间换时间&#xff0c;因为在遍历的过程中需要用一个栈来记录右边第一个比当前元…...

Maven构建OSGI+HttpServer应用

Maven构建OSGIHttpServer应用 官网&#xff08;https://eclipse.dev/equinox/server/http_in_equinox.php&#xff09;介绍有两种方式&#xff1a; 一种是基于”org.eclipse.equinox.http”包的轻量级实现&#xff0c;另一种是基于”org.eclipse.equinox.http.jetty”包&#…...

chrome扩展插件常用文件及作用

Chrome扩展通常包含以下常用文件及其作用&#xff1a; manifest.json&#xff1a; 描述了扩展的基本信息&#xff0c;如名称、版本、权限、图标等。定义了扩展的各种组件和功能&#xff0c;包括后台脚本、内容脚本、页面、浏览器动作按钮等。 background.js&#xff1a; 后台脚…...

PdfFactory Pro软件下载以及序列号注册码生成器

PdfFactory Pro注册机是一款针对同名虚拟打印机软件所推出的用户名和序列号生成器。PdfFactory Pro是一款非常专业的PDF虚拟打印软件&#xff0c;通过使用这款注册机&#xff0c;就能帮助用户免费获取注册码&#xff0c;一键激活&#xff0c;永久免费使用。 pdffactory7注册码如…...

jsp康养小镇管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP康养小镇管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0&a…...

Android 无操作之后定时退出

android定时器监用户听对页面无操作5分钟退出登录实现 - 简书 private long advertisingTime 600000;///定时结束退出登录10分(分钟)600000毫秒public CountDownTimer countDownTimer;Overrideprotected void onResume() {super.onResume();//启动定时if (isTimedExitApp()) …...

CMS 检测神器:CMSeek 保姆级教程(附链接)

一、介绍 CMSeek&#xff08;Content Management System Exploitation and Enumeration Toolkit&#xff09;是一款用于检测和利用网站上可能存在的内容管理系统&#xff08;CMS&#xff09;漏洞的开源工具。它旨在帮助安全研究人员和渗透测试人员识别目标网站所使用的CMS&…...

oracle 启动命令以及ORA-01033问题处理、删除归档日志

1 启动数据库:startup 2 关闭数据库&#xff1a;Shutdown immediate 3 查看监听状态&#xff1a;lsnrctl status 4 启动监听&#xff1a;lsnrctl start 5 停止监听&#xff1a;lsnrctl stop 常见问题 1、在服务器重启后会出现&#xff0c;Oracle ORA-01033: ORAC…...

【大模型上下文长度扩展】MedGPT:解决遗忘 + 永久记忆 + 无限上下文

MedGPT&#xff1a;解决遗忘 永久记忆 无限上下文 问题&#xff1a;如何提升语言模型在长对话中的记忆和处理能力&#xff1f;子问题1&#xff1a;有限上下文窗口的限制子问题2&#xff1a;复杂文档处理的挑战子问题3&#xff1a;长期记忆的维护子问题4&#xff1a;即时信息检…...

谷歌seo搜索引擎优化有什么思路?

正常做seo哪有那么多思路&#xff0c;其实就那么几种方法&#xff0c;无非就关键词&#xff0c;站内优化&#xff0c;外链&#xff0c;可以说万变不离其宗&#xff0c;但如果交给我们&#xff0c;你就可以实现其他的思路&#xff0c;或者说玩法 收录可以说是一个网站的基础&…...

腾讯云与IBM共同打造“高性能计算服务解决方案“

腾讯云与IBM共同打造"高性能计算服务解决方案" 腾讯云与IBM达成战略合作&#xff0c;对优势产品及服务进行深度集成&#xff0c;基于腾讯云产品及服务&#xff0c;共同打造"腾讯-IBM混合云与人工智能解决方案"。双方通过更为紧密的嵌入式解决方案的深度合…...

【SparkML实践7】特征选择器FeatureSelector

本节介绍了用于处理特征的算法&#xff0c;大致可以分为以下几组&#xff1a; 提取&#xff08;Extraction&#xff09;&#xff1a;从“原始”数据中提取特征。转换&#xff08;Transformation&#xff09;&#xff1a;缩放、转换或修改特征。选择&#xff08;Selection&…...

LeetCode983. Minimum Cost For Tickets——动态规划

文章目录 一、题目二、题解 一、题目 You have planned some train traveling one year in advance. The days of the year in which you will travel are given as an integer array days. Each day is an integer from 1 to 365. Train tickets are sold in three differen…...

百卓Smart管理平台 uploadfile.php 文件上传漏洞【CVE-2024-0939】

百卓Smart管理平台 uploadfile.php 文件上传漏洞【CVE-2024-0939】 一、 产品简介二、 漏洞概述三、 影响范围四、 复现环境五、 漏洞复现手动复现小龙验证Goby验证 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工…...

项目中常用的一些数据库及缓存

1、常见的开发工具介绍 MySQL: MySQL是一种流行的开源关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;由瑞典MySQL AB公司开发&#xff0c;并在后来被Sun Microsystems收购&#xff0c;最终成为Oracle公司的一部分。MySQL广泛用于各种Web应用程序和大型企业应…...

MoE-LLaVA:具有高效缩放和多模态专业知识的大型视觉语言模型

视觉和语言模型的交叉导致了人工智能的变革性进步&#xff0c;使应用程序能够以类似于人类感知的方式理解和解释世界。大型视觉语言模型(LVLMs)在图像识别、视觉问题回答和多模态交互方面提供了无与伦比的能力。 MoE-LLaVA利用了“专家混合”策略融合视觉和语言数据&#xff0…...

【Java】ArrayList和LinkedList的区别是什么

目录 1. 数据结构 2. 性能特点 3. 源码分析 4. 代码演示 5. 细节和使用场景 ArrayList 和 LinkedList 分别代表了两类不同的数据结构&#xff1a;动态数组和链表。它们都实现了 Java 的 List 接口&#xff0c;但是有着各自独特的特点和性能表现。 1. 数据结构 ArrayList…...

RabbitMQ-4.MQ的可靠性

MQ的可靠性 4.MQ的可靠性4.1.数据持久化4.1.1.交换机持久化4.1.2.队列持久化4.1.3.消息持久化 4.2.LazyQueue4.2.1.控制台配置Lazy模式4.2.2.代码配置Lazy模式4.2.3.更新已有队列为lazy模式 4.MQ的可靠性 消息到达MQ以后&#xff0c;如果MQ不能及时保存&#xff0c;也会导致消…...

编程相关的经典的网站和书籍

经典网站&#xff1a; Stack Overflow&#xff1a;作为全球最大的程序员问答社区&#xff0c;Stack Overflow 汇聚了大量的编程问题和解答&#xff0c;为程序员提供了极大的帮助。GitHub&#xff1a;全球最大的开源代码托管平台&#xff0c;程序员可以在上面共享自己的项目代码…...

Java代码实现基数排序算法(附带源码)

基数排序是一种非比较型整数排序算法&#xff0c;其原理是将整数按位数切割成不同的数字&#xff0c;然后按每个位数分别比较。由于整数也可以表达字符串&#xff08;比如名字或日期&#xff09;和特定格式的浮点数&#xff0c;所以基数排序也不是只能使用于整数。 1. 基数排序…...

基于python+django,我开发了一款药店信息管理系统

功能介绍 平台采用B/S结构&#xff0c;后端采用主流的Python语言进行开发&#xff0c;前端采用主流的Vue.js进行开发。 功能包括&#xff1a;药品管理、分类管理、顾客管理、用户管理、日志管理、系统信息模块。 代码结构 server目录是后端代码web目录是前端代码 部署运行…...

VSCODE使用ssh远程连接时启动服务器失败问题

错误情况 ping服务器的ip可通并且使用terminal可以ssh连接到远程服务器。但使用vscode的remote-ssh时&#xff0c;在「输出」栏出现了一直报 Waiting for server log… 的情况&#xff01; 解决方法一 重置服务器设置&#xff0c;包括以下手段&#xff1a; 1.清理服务器端的…...

easyexcle 导出csv

导入jar <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.3.3</version></dependency>代码 private static List<List<String>> head() {List<List<String>&g…...

Ubuntu22.04 gnome-builder gnome C 应用程序习练笔记(一)

一、序言 gnome-builder构建器是gnome程序开发的集成环境&#xff0c;支持主力语言C, C, Vala, jscript, python等&#xff0c;界面以最新的 gtk 4.12 为主力&#xff0c;将其下版本的gtk直接压入了depreciated&#xff0c;但gtk4.12与普遍使用的gtk3有很大区别&#xff0c;原…...

ESP32QRCodeReader库使用,ESP32-CAM识别二维码并向自写接口发出请求确认身份。

#include <Arduino.h> #include <WiFi.h> #include <HTTPClient.h> #include <ESP32QRCodeReader.h>#define WIFI_SSID "username" #define WIFI_PASSWORD "password" // 连接电脑主机的IP地址的8088端口 #define WEBHOOK_URL &qu…...

什么是网络渗透,应当如何防护?

什么是网络渗透 网络渗透是攻击者常用的一种攻击手段&#xff0c;也是一种综合的高级攻击技术&#xff0c;同时网络渗透也是安全工作者所研究的一个课题&#xff0c;在他们口中通常被称为"渗透测试(Penetration Test)"。无论是网络渗透(Network Penetration)还是渗透…...

掌握C++中的动态数据:深入解析list的力量与灵活性

1. 引言 简介std::list和其在C中的角色 std::list是C标准模板库&#xff08;STL&#xff09;中提供的一个容器类&#xff0c;实现了双向链表的数据结构。与数组或向量等基于连续内存的容器不同&#xff0c;std::list允许非连续的内存分配&#xff0c;使得元素的插入和删除操作…...

天地伟业接入视频汇聚/云存储平台EasyCVR详细步骤

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…...

Vue源码系列讲解——虚拟DOM篇【二】(Vue中的DOM-Diff)

目录 1. 前言 2. patch 3. 创建节点 4. 删除节点 5. 更新节点 6. 总结 1. 前言 在上一篇文章介绍VNode的时候我们说了&#xff0c;VNode最大的用途就是在数据变化前后生成真实DOM对应的虚拟DOM节点&#xff0c;然后就可以对比新旧两份VNode&#xff0c;找出差异所在&…...

基于AST实现一键自动提取替换国际化文案

背景&#xff1a;在调研 formatjs/cli 使用&#xff08;使用 formatjs/cli 进行国际化文案自动提取 &#xff09;过程中&#xff0c;发现有以下需求formatjs/cli 无法满足&#xff1a; id 需要一定的语义化&#xff1b; defaultMessage和Id不能直接hash转换&#xff1b; 需要…...

嵌入式硬件工程师与嵌入式软件工程师

嵌入式硬件工程师与嵌入式软件工程师 纯硬件设备与嵌入式设备 纯硬件设备是指内部不包含微处理器&#xff0c;无需烧写软件就能够运行的电子设备。如天线、老式收音机、老式电视机、老式洗衣机等。这类设备通常功能简单&#xff0c;易于操作&#xff0c;用户通常只需要打开电…...

【华为云】云上两地三中心实践实操

写在前面 应用上云之后&#xff0c;如何进行数据可靠性以及业务连续性的保障是非常关键的&#xff0c;通过华为云云上两地三中心方案了解相关方案认证地址&#xff1a;https://connect.huaweicloud.com/courses/learn/course-v1:HuaweiXCBUCNXI057Self-paced/about当前内容为华…...

Linux大集合

Linux Linux是什么&#xff1f; Linux是一套免费使用和自由传播的类Unix操作系统&#xff0c;是一个基于POSIX和UNIX的多用户、多任务、 支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和 64位硬件。 Linux内核 是一个Linux系统…...

深入解析 Spring 事务机制

当构建复杂的企业级应用程序时&#xff0c;数据一致性和可靠性是至关重要的。Spring 框架提供了强大而灵活的事务管理机制&#xff0c;成为开发者处理事务的首选工具。本文将深入探讨 Spring 事务的使用和原理&#xff0c;为大家提供全面的了解和实际应用的指导。 本文概览 首…...

第9章 安全漏洞、威胁和对策(9.11-9.16)

9.11 专用设备 专用设备王国疆域辽阔&#xff0c;而且仍在不断扩张。 专用设备是指为某一特定目的而设计&#xff0c;供某一特定类型机构使用或执行某一特定功能的任何设备。 它们可被看作DCS、物联网、智能设备、端点设备或边缘计算系统的一个类型。 医疗设备、智能汽车、…...

Mysql-数据库压力测试

安装软件 官方软件 安装插件提供了更多的监听器选项 数据库驱动 数据库测试 配置 这里以一个简单的案例进行&#xff0c;进行连接池为10,20,30的梯度压测&#xff1a; select * from tb_order_item where id 1410932957404114945;新建一个线程组 新增一个连接池配置 新建一…...

CI/CD总结

bitbucket deployment: Bitbucket Cloud resources | Bitbucket Cloud | Atlassian Support Jenkins:...

【CSS】margin塌陷和margin合并及其解决方案

【CSS】margin塌陷和margin合并及其解决方案 一、解决margin塌陷的问题二、避免外边距margin重叠&#xff08;margin合并&#xff09; 一、解决margin塌陷的问题 问题&#xff1a;当父元素包裹着一个子元素且父元素没有边框的时候&#xff0c;当给子元素设置margin-top:100px&…...

Python并发

Python是运行在解释器中的语言&#xff0c;查找资料知道&#xff0c;python中有一个全局锁&#xff08;GIL&#xff09;&#xff0c;在使用多线程(Thread)的情况下&#xff0c;不能发挥多核的优势。而使用多进程(Multiprocess)&#xff0c;则可以发挥多核的优势真正地提高效率。…...

2024-02-04(hive)

1.Hive中的分区表 可以选择字段作为表分区。 分区其实就是HDFS上的不同文件夹。 分区表可以极大的提高特定场景下Hive的操作性能。 2.分区语法 create table tablename(...) partitioned by (分区列 列类型, ...) row format delimited fields terminated by ; 3.Hive中的…...

P9420 [蓝桥杯 2023 国 B] 子 2023 / 双子数--2024冲刺蓝桥杯省一

点击跳转例题 子2023思路&#xff1a;dp。最开始想着枚举&#xff0c;但是超时&#xff0c;想着优化以下&#xff0c;但是还是不行。 那么切换算法&#xff0c;应该是dp&#xff1a; 1.f [i] 表示当前字符串 以 2023 为第 i 位的数量方案&#xff1a;如f [0] 表示 前i个字符串…...

The Back-And-Forth Method (BFM) for Wasserstein Gradient Flows windows安装

本文记录了BFM算法代码在windows上的安装过程。 算法原网站&#xff1a;https://wasserstein-gradient-flows.netlify.app/ github&#xff1a;https://github.com/wonjunee/wgfBFMcodes 文章目录 FFTWwgfBFMcodesMATLABpython注 FFTW 官网/下载路径&#xff1a;https://ww…...

【GAMES101】Lecture 19 透镜

目录 理想的薄透镜 模糊 利用透镜模型做光线追踪 景深&#xff08;Depth of Field&#xff09; 理想的薄透镜 在实际的相机中都是用的一组透镜来作为这个镜头 这个因为真实的棱镜无法将光线真正聚焦到一个点上&#xff0c;它只能聚在一堆上 所以方便研究提出了一种理想化的…...

防范恶意勒索攻击!亚信安全发布《勒索家族和勒索事件监控报告》

本周态势快速感知 本周全球共监测到勒索事件81起&#xff0c;事件数量有所下降&#xff0c;比上月降低20%。 lockbit3.0仍然是影响最严重的勒索家族&#xff1b;akira和incransom也是两个活动频繁的恶意家族&#xff0c;需要注意防范。 本周alphv勒索组织窃取MBC法律专业公司…...

AR人脸106240点位检测解决方案

美摄科技针对企业需求推出了AR人脸106/240点位检测解决方案&#xff0c;为企业提供高效、精准的人脸识别服务&#xff0c;采用先进的人脸识别算法和机器学习技术&#xff0c;通过高精度、高速度的检测设备&#xff0c;对人脸进行快速、准确地定位和识别。该方案适用于各种应用场…...

数字图像处理实验记录八(图像压缩实验)

前言&#xff1a;做这个实验的时候很忙&#xff0c;就都是你抄我我抄你了 一、基础知识 1&#xff0e;为什么要进行图像压缩&#xff1a; 图像的数据量巨大&#xff0c;对计算机的处理速度、存储容量要求高。传输信道带宽、通信链路容量一定&#xff0c;需要减少传输数据量&a…...

navigator.mediaDevices.getUserMedia获取本地音频/麦克权限并提示用户

navigator.mediaDevices.getUserMedia获取本地音频/麦克权限并提示用户 效果获取权限NotFoundErrorNotAllowedError 代码 效果 获取权限 NotFoundError NotAllowedError 代码 // 调用 captureLocalMedia()// 方法 function captureLocalMedia() {console.warn(Requesting lo…...

CTF-show WEB入门--web19

今晚web19也就顺便解决了 老样子我们先打开题目看看题目提示&#xff1a; 可以看到题目提示为&#xff1a; 密钥什么的&#xff0c;就不要放在前端了 然后我们打开题目链接&#xff1a; 然后我们查看网页源代码&#xff1a; 可以发现有用的内容全在网页源代码里。 前端验证…...

04 使用gRPC实现客户端和服务端通信

使用gRPC实现客户端和服务端通信 参考文档: 基于C#的GRPC 1 创建项目和文件夹 GrpcClientDemoGrpcServerDemoProtos解决方案和文件夹1.1 添加nuget依赖 客户端和服务器都要有依赖和gRPC_Objects文件夹 <ItemGroup><PackageReference Include"Google.Protobu…...

设计模式-行为型模式(下)

1.访问者模式 访问者模式在实际开发中使用的非常少,因为它比较难以实现并且应用该模式肯能会导致代码的可读性变差,可维护性变差,在没有特别必要的情况下,不建议使用访问者模式. 访问者模式(Visitor Pattern) 的原始定义是&#xff1a; 允许在运行时将一个或多个操作应用于一…...