【动态规划算法题记录】最长/最大 问题汇总 (leetcode)

news2024/9/22 1:21:01

目录

  • 32. 最长有效括号
    • 思路
    • 代码
  • 300. 最长递增子序列
    • 思路
    • 代码
  • 674. 最长连续递增序列
    • 思路1:双指针
    • 代码1:双指针
    • 思路2:dp
    • 代码2:dp
  • 718. 最长重复子数组
    • 思路1:dp
    • 代码1:dp
    • 思路2:dp优化
    • 代码2:dp优化
  • 1143. 最长公共子序列
    • 思路
    • 代码
  • 1035. 不相交的线(最大连线数)
    • 思路
    • 代码
  • 53. 最大子序和
    • 思路1:贪心
    • 代码1:贪心
    • 思路2:dp
    • 代码2:dp

32. 最长有效括号

题目🔗

给你一个只包含 '('')' 的字符串,找出最长有效(格式正确且连续)括号子串的长度。

示例 1
输入:s = "(()"
输出:2
解释:最长有效括号子串是 "()"
示例 2
输入:s = ")()())"
输出:4
解释:最长有效括号子串是 "()()"
示例 3
输入:s = ""
输出:0

思路

首先,我们定义一个dp数组,表示以第i个元素结尾的字符串的最长有效括号的长度。

对于dp[i]来说,它可能有以下两种情况:

  • s[i] == '(':这时他是无法和前面的括号组成有效括号对的,所以dp[i] = 0
  • s[i] == ')':这时我们需要确定它是否能和前面的元素组成有效括号对,那么还需要去观察s[i-1]
    • s[i-1] == '('s[i-1]刚好和s[i]组成一对有效括号,长度为2。那么这种情况下我们可以推导出: d p [ i ] = d p [ i − 2 ] + 2 dp[i] = dp[i-2] + 2 dp[i]=dp[i2]+2
    • s[i-1] == ')':对于这种情况来说,我们不知道s[i-1]是否和前面的元素组成有效括号,但无论如何,dp[i-1]中存放的总是以s[i-1]结尾的字符串的最长有效括号长度。假设s[i-1]是有效的括号对之一,那么与他配对的括号index就是i-dp[i-1],于是乎我们就可以找到和s[i]配对的位置i-dp[i-1]-1,这样如果s[i-dp[i-1]-1] == '(',那么s[i]就能与他配对上。那么我们就可以推导出: d p [ i ] = d p [ i − 1 ] + 2 + d p [ i − d p [ i − 1 ] − 2 ] dp[i] = dp[i-1] + 2 + dp[i-dp[i-1]-2] dp[i]=dp[i1]+2+dp[idp[i1]2]

注意,上面要需要加上 d p [ i − d p [ i − 1 ] − 2 ] dp[i-dp[i-1]-2] dp[idp[i1]2],这是因为如果我们判定s[i-dp[i-1]-1] == '('s[i]配对的话,还需要考虑s[i-dp[i-1]-1]之前的情况。

代码

class Solution {
public:
    int longestValidParentheses(string s) {
        vector<int> dp(s.size(), 0);
        int ans = 0;
        for(int i = 1; i < s.size(); ++i){
            if(s[i] == ')'){
                // 前面一个是(的情况,直接配对成功
                if(s[i - 1] == '('){
                    dp[i] = 2;
                    // 加上前面配对的数量
                    if(i - 2 >= 0) dp[i] += dp[i - 2];
                }
                // 前面一个也是),但是有配对的
                else if(dp[i - 1] > 0){
                    // 判断匹配位置的符号是不是(,如果是则可以配对
                    if((i - dp[i - 1] - 1) >= 0 && s[i - dp[i - 1] - 1] == '('){
                        dp[i] = dp[i - 1] + 2;
                        // 加上前面配对的数量
                        if(i - dp[i - 1] - 2 >= 0) 
                        	dp[i] += dp[i - dp[i - 1] - 2];
                    }
                }
            }
            ans = max(ans, dp[i]);
        }
        return ans;
    }
};

300. 最长递增子序列

题目🔗

给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。

子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。

示例 1
输入:nums = [10,9,2,5,3,7,101,18]
输出:4
解释:最长递增子序列是 [2,3,7,101],因此长度为 4
示例 2
输入:nums = [0,1,0,3,2,3]
输出:4
示例 3
输入:nums = [7,7,7,7,7,7,7]
输出:1

思路

dp[i]表示第i个数为结尾的子序列的最长严格递增长度。

很容易的就能想到,我们要计算的dp[i]一共有两种情况:
- nums[i] > nums[i - 1]:此时dp[i] = dp[i-1] + 1
- nums[i] < nums[i - 1]:此时dp[i] = dp[i-1]

但是如果我们简单的将代码写成这样:

int lengthOfLIS(vector<int>& nums) {
        vector<int> dp(nums.size(), 1);
        for(int i = 1; i < nums.size(); ++i){
            if(nums[i] > nums[i - 1])
                dp[i] = dp[i - 1] + 1;
            else 
                dp[i] = dp[i-1];
        }
        return dp[nums.size()-1];
    }

当测试用例为:nums = [4,10,4,3,8,9]。我们打印出上面代码计算出的dp数组:1 2 2 2 3 4 。可以发现并不是我们所期望的那样,当i=4时,dp[4]应该为2,而不是3

我们计算成3是因为:对于子数组[4,10,4,3]来说,它的最大递增子序列为4, 10。我们如果只是简单的判断nums[4] > nums[3],就执行dp[i] = dp[i - 1] + 1,那么就相当于是把4, 10, 8当成了最大递增子序列,然而它并不是的,所以这里就出现了判断失误。

正确的做法是,我们要把dp[i]定义为第i个数为结尾的子数组的最长严格递增长度,并且该最长严格递增子序列最后一个数必定是nums[i]

每次进行判断的时候,我们要对该子数组各个位置nums[j]进行遍历,并比较与nums[i]的大小,如果nums[i] > nums[j],那么就有dp[i] = max(dp[i], dp[j] + 1)

最终答案就是dp数组中最大的那个数。

代码

class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {
        vector<int> dp(nums.size(), 1);
        int ans = 1;
        for(int i = 1; i < nums.size(); ++i){
            for(int j = 0; j < i; ++j){
                if(nums[i] > nums[j])
                    dp[i] = max(dp[i], dp[j] + 1);
            }
            ans = max(ans, dp[i]);
        }
        return ans;
    }
};

674. 最长连续递增序列

题目🔗

给定一个未经排序的整数数组,找到最长且 连续递增的子序列,并返回该序列的长度。

连续递增的子序列 可以由两个下标 lrl < r)确定,如果对于每个 l <= i < r,都有 nums[i] < nums[i + 1] ,那么子序列 [nums[l], nums[l + 1], ..., nums[r - 1], nums[r]] 就是连续递增子序列。

示例 1
输入:nums = [1,3,5,4,7]
输出:3
解释:最长连续递增序列是 [1,3,5], 长度为3
尽管 [1,3,5,7] 也是升序的子序列, 但它不是连续的,因为 57 在原数组里被 4 隔开。
示例 2
输入:nums = [2,2,2,2,2]
输出:1
解释:最长连续递增序列是 [2], 长度为1

思路1:双指针

定义两个指针:int slowint fast

代码1:双指针

class Solution {
public:
    int findLengthOfLCIS(vector<int>& nums) {
        int slow = 0;
        int ans = 0;
        while(slow < nums.size()){
            int fast = slow + 1;
            while(fast < nums.size() && nums[fast] > nums[fast - 1]){
                fast++;
            }
            ans = max(ans, fast - slow);
            slow = fast;
        }
        return ans;
    }
};

思路2:dp

dp的思路和上题类似。我们定义一个dp数组,dp[i]表示第i个数为结尾的子数组的最长连续递增长度,并且该最长连续递增序列最后一个数必定是nums[i]

与上题不一样的就是我们不在需要遍历子数组了,直接判断nums[i]nums[i - 1]的大小即可。

代码2:dp

class Solution {
public:
    int findLengthOfLCIS(vector<int>& nums) {
        vector<int> dp(nums.size(), 1);
        int ans = 1;
        for(int i = 1; i < nums.size(); ++i){
            if(nums[i] > nums[i - 1]){
                dp[i] = max(dp[i], dp[i - 1] + 1);
            }
            ans = max(ans, dp[i]);
        }
        return ans;
    }
};

718. 最长重复子数组

题目🔗

给两个整数数组 nums1nums2 ,返回 两个数组中 公共的 、长度最长的子数组的长度 。

示例 1
输入:nums1 = [1,2,3,2,1], nums2 = [3,2,1,4,7]
输出:3
解释:长度最长的公共子数组是 [3,2,1]
示例 2
输入:nums1 = [0,0,0,0,0], nums2 = [0,0,0,0,0]
输出:5

思路1:dp

dp[i][j]表示数组nums1i个元素数组nums2j个元素的最长公共子数组的长度。其实也是和上题一样的。

代码1:dp

我们可以很快写出代码:

class Solution {
public:
    int findLength(vector<int>& nums1, vector<int>& nums2) {
        vector<vector<int>> dp(nums1.size(), vector<int>(nums2.size(), 0));
        int ans = 0;
        // dp数组初始化
        for(int i = 0; i < nums1.size(); ++i){
            if(nums2[0] == nums1[i]) dp[i][0] = 1;
            if(dp[i][0] > ans) ans = dp[i][0];
        }
        for(int j = 0; j < nums2.size(); ++j){
            if(nums1[0] == nums2[j]) dp[0][j] = 1;
            if(dp[0][j] > ans) ans = dp[0][j];
        }
        // dp数组推导
        for(int i = 1; i < nums1.size(); ++i){
            for(int j = 1; j < nums2.size(); ++j){
                if(nums1[i] == nums2[j])
                    dp[i][j] = dp[i - 1][j - 1] + 1;
                if(dp[i][j] > ans) 
                    ans = dp[i][j];
            }
        }
        return ans;
    }
};

注意初始化的时候我们也要去更新ans的大小,不然会漏结果。

思路2:dp优化

其实,我们可以将dp[i][j]定义为数组nums1i-1个元素数组nums2j-1个元素的最长公共子数组的长度,也就是在nums1前增加一行,nums2前增加一列:
在这里插入图片描述
这样我们在定义数组的时候就已经初始化好了,不必额外去for循环初始化:vector<vector<int>> dp (nums1.size() + 1, vector<int>(nums2.size() + 1, 0));

代码2:dp优化

class Solution {
public:
    int findLength(vector<int>& nums1, vector<int>& nums2) {
        vector<vector<int>> dp(nums1.size() + 1, vector<int>(nums2.size() + 1, 0));
        int ans = 0;
        // dp数组推导
        for(int i = 1; i <= nums1.size(); ++i){
            for(int j = 1; j <= nums2.size(); ++j){
                if(nums1[i - 1] == nums2[j - 1])
                    dp[i][j] = dp[i - 1][j - 1] + 1;
                if(dp[i][j] > ans) 
                    ans = dp[i][j];
            }
        }
        return ans;
    }
};

1143. 最长公共子序列

题目🔗

给定两个字符串 text1text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0

一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。

例如,"ace""abcde" 的子序列,但 "aec" 不是 "abcde" 的子序列。
两个字符串的 公共子序列 是这两个字符串所共同拥有的子序列。

示例 1
输入:text1 = "abcde", text2 = "ace"
输出:3
解释:最长公共子序列是 "ace" ,它的长度为 3
示例 2
输入:text1 = "abc", text2 = "abc"
输出:3
解释:最长公共子序列是 "abc" ,它的长度为 3
示例 3
输入:text1 = "abc", text2 = "def"
输出:0
解释:两个字符串没有公共子序列,返回 0

思路

这题和上题的不同之处在于 公共子序列原字符串相对有序的。感觉这题有点像300. 最长递增子序列718. 最长重复子数组的结合体。

上一题以i-1j-1是因为子数组必须要求是连续的,如果不连续,公共子数组直接归零,下一个子数组不能继承前一个子数组的公共子数组长度。

子序列则不一样,允许中间有间隔,下一个子序列可以继承前一个子序列的公共子序列长度

这样说很抽象,我们举个例子。比如说两个数组nums1 = [1,2,3,4,5], nums2 = [1,2,3,8,5] 。在index=3的时候出现分歧了,如果是公共子数组,index=3时,其公共子数组必须要归零,如果不归零,会影响index=4的判断。而如果是公共子序列,index=3可以保留index=2的最长子序列数,继而在index=4时继续递增。

代码

class Solution {
public:
    int longestCommonSubsequence(string text1, string text2) {
        int len1 = text1.size();
        int len2 = text2.size();
        vector<vector<int>> dp(len1 + 1, vector<int>(len2 + 1, 0));
        for(int i = 1; i <= len1; ++i){
            for(int j = 1; j <= len2; ++j){
                if(text1[i - 1] == text2[j - 1]){
                    dp[i][j] = dp[i - 1][j - 1] + 1;
                }
                else{
                    dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
                }
            }
        }
        return dp[len1][len2];
    }
};

1035. 不相交的线(最大连线数)

题目🔗

在两条独立的水平线上按给定的顺序写下 nums1nums2 中的整数。

现在,可以绘制一些连接两个数字 nums1[i]nums2[j] 的直线,这些直线需要同时满足:

  • nums1[i] == nums2[j]
  • 且绘制的直线不与任何其他连线(非水平线)相交。
    请注意,连线即使在端点也不能相交:每个数字只能属于一条连线。

以这种方法绘制线条,并返回可以绘制的最大连线数。

示例 1
在这里插入图片描述
输入:nums1 = [1,4,2], nums2 = [1,2,4]
输出:2
解释:可以画出两条不交叉的线,如上图所示。 但无法画出第三条不相交的直线,因为从 nums1[1]=4nums2[2]=4 的直线将与从 nums1[2]=2nums2[1]=2 的直线相交。
示例 2
输入:nums1 = [2,5,1,2,5], nums2 = [10,5,2,1,5,2]
输出:3
示例 3
输入:nums1 = [1,3,7,1,7,5], nums2 = [1,9,2,5,1]
输出:2

思路

1143. 最长公共子序列一模一样。

代码

class Solution {
public:
    int maxUncrossedLines(vector<int>& nums1, vector<int>& nums2) {
        int len1 = nums1.size();
        int len2 = nums2.size();
        vector<vector<int>> dp(len1 + 1, vector<int>(len2 + 1, 0));
        for(int i = 1; i <= len1; ++i){
            for(int j = 1; j <= len2; ++j){
                if(nums1[i - 1] == nums2[j - 1]){
                    dp[i][j] = dp[i - 1][j - 1] + 1;
                }
                else{
                    dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
                }
            }
        }
        return dp[len1][len2];
    }
};

53. 最大子序和

题目🔗

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组是数组中的一个连续部分。

示例 1
输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6
示例 2
输入:nums = [1]
输出:1
示例 3
输入:nums = [5,4,-1,7,8]
输出:23

思路1:贪心

因为数组中包含负数,所以会拉低连续子数组的和,甚至变为负数,这个时候就说明从前面计算到这里的负数,再继续计算下去肯定只会越来越小,所以我们要放弃前面的元素,从下一个元素开始重新计算。每次计算的时候我们都要记录更大的连续和,最后得到的就是全局最优的最大连续和。

代码1:贪心

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int result = INT32_MIN;
        int count = 0;
        for(int i = 0; i < nums.size(); i++) {
            count += nums[i];
            if(count > result) result = count;
            if(count <= 0) count = 0;
        }
        return result;
    }
};

思路2:dp

dp[i]表示以nums[i-1]为结尾的最大子数组的和为dp[i]

对于每个dp[i]都有两种情况:

  • nums[i-1]加入到前面的子数组中,也就是dp[i] = dp[i - 1] + nums[i - 1]
  • nums[i-1]不加入到前面的子数组中,从它这里重新开始计算和,也就是dp[i] = numd[i - 1]
  • 我们取最大的值:dp[i] = max(nums[i - 1], dp[i - 1] + nums[i - 1])

代码2:dp

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        vector<int> dp(nums.size() + 1, 0);
        int ans = INT_MIN;
        for(int i = 1; i <= nums.size(); ++i){
            dp[i] = max(nums[i - 1], dp[i - 1] + nums[i - 1]);
            if(dp[i] > ans) ans = dp[i];
        }
        return ans;
    }
};

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

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

相关文章

安恒信息总裁离职,转型创业开起了饭店,你怎么看?

【科技明说 &#xff5c; 科技热点关注】 8月20日&#xff0c;前安恒信息总裁宋端智开办自己公众号官宣离职&#xff0c;一心投入了大排档&#xff0c;转型做起了餐饮行业。 据他官宣信息透露&#xff0c;不久前辞去了安恒信息总裁职务&#xff0c;决定把重心放到餐饮创业上。…

虹科免拆诊断案例 | 2012 款捷豹 XJ 车发动机怠速轻微抖动

障现象  一辆2012款捷豹XJ车&#xff0c;搭载3.0T发动机&#xff08;型号为306PS&#xff09;&#xff0c;累计行驶里程约为14.7万km。车主反映&#xff0c;发动机怠速轻微抖动&#xff0c;感觉不舒服&#xff0c;为此先后更换过火花塞、点火线圈、喷油器及氧传感器等&#x…

安装Cellpose

Cellpose是目前运用范围最广、效果最好的细胞分割模型&#xff0c;以下是安装方法。 3.1 安装cellpose 3.1.1 创建cellpose 打开Anaconda Navigator,如下图所示&#xff1a; 图3.1.1.1 Anaconda Navigator 依次点击 Environments、Create&#xff0c;在弹出的窗中&#xff0…

校园志愿者管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图详细视频演示技术栈系统测试为什么选择我官方认证玩家&#xff0c;服务很多代码文档&#xff0c;百分百好评&#xff0c;战绩可查&#xff01;&#xff01;入职于互联网大厂&#xff0c;可以交流&#xff0c;共同进步。有保障的售后 代码参考数据库参…

钢铁百科:A633C美标高强度钢板、A633C化学成分分析、A633C执行ASTM A633/A633M标准

A633C是一种美国ASTM标准的高强度低合金结构钢&#xff08;HSLA&#xff09;&#xff0c;广泛应用于工程结构建设中&#xff0c;特别是在那些需要更高强度和更好焊接性能的场合。 1. **材质解析&#xff1a; - A633C钢是一种碳锰调质高强度结构钢&#xff0c;通过添加合金元素…

全网刷屏的《黑神话:悟空》,在deepin 23上玩是一种什么体验?

查看原文 过年了&#xff01;&#xff01;&#xff01; 8月20日上午10点&#xff0c;首款国产现象级3A游戏《黑神话&#xff1a;悟空》正式上线。 “重走西游&#xff0c;直面天命&#xff01;” 作为国产第一款3A游戏大作&#xff0c;《黑神话&#xff1a;悟空》称得上是里…

产品经理原型设计工具 Axure 的使用

原型设计工具 Axure 中文学习网&#xff1a;https://www.axure.com.cn/ 1、安装 2023年Axure RP9最新安装、汉化教程&#xff08;附带安装包下载&#xff09; 2、基本使用 Axure rp9入门图文教程——基操及介绍&#xff08;看完就能上手&#xff0c;人人都是产品经理&#x…

微软发布功能强大的全新 Phi-3.5 机型,击败谷歌、OpenAI 等公司

微软并没有因为与 OpenAI 的合作而满足于其在人工智能领域的成功。 相反&#xff0c;这家因总部位于华盛顿州而被称为雷德蒙德&#xff08;Redmond&#xff09;的公司今天发布了其不断发展的语言/多模态人工智能 Phi 系列中的 3 个新模型。这三个模型分别针对基本/快速推理、更…

pygame开发课程系列(4): 游戏元素

第四章 游戏元素 在本章中&#xff0c;我们将深入探讨如何在 Pygame 中处理游戏元素&#xff0c;包括键盘输入、鼠标输入、图像加载和声音播放。这些元素是构建互动游戏的基础&#xff0c;能够让你的游戏变得更生动、更有趣。 4.1 处理键盘输入 键盘输入是控制游戏角色或元素…

微服务及安全

一、微服务的原理 1.什么是微服务架构 微服务架构区别于传统的单体软件架构,是一种为了适应当前互联网后台服务的「三高需求:高并发、高性能、高可用」而产生的的软件架构。 单体式应用程序 与微服务相对的另一个概念是传统的单体式应用程序( Monolithic application ),…

【Git】分支的创建、提交、合并、冲突、删除

Git分支 分支的创建更改的提交合并分支到主支解决冲突删除分支 可以将项目不断修改调整的过程放到分支上&#xff0c;修改定性之后再将分支内容向主支合并 分支的创建 //创建一个新的分支&#xff08; new-fenzhi&#xff1a;自定义分支名 &#xff09; git branch new-fenzhi…

【源码】基于Java开发的HRM人力资源管理系统(企业人力管理实际项目)

在当今企业迅速扩张与业务日益复杂的环境下&#xff0c;传统的人力资源管理方式已显得力不从心。为了应对这一挑战&#xff0c;eHR人力资源管理系统应运而生&#xff0c;它以其强大的功能和卓越的性能&#xff0c;为企业的人力资源管理带来了革命性的变革。 一、系统概览与技术…

AI文本转语音:Toucan TTS 支持 7000 多种语言的语音合成工具箱,突破性 OCR 技术:支持多种语言识别,媲美顶级云服务

AI文本转语音&#xff1a;Toucan TTS 支持 7000 多种语言的语音合成工具箱&#xff0c;突破性 OCR 技术&#xff1a;支持多种语言识别&#xff0c;媲美顶级云服务。 AI文本转语音&#xff1a;Toucan TTS 支持 7000 多种语言的语音合成工具箱 Toucan TTS是由德国斯图加特大学自…

【教程】Win11用户必看:旧版记事本恢复方法!

在Win11电脑操作中&#xff0c;很多用户并不喜欢新版的记事本&#xff0c;想知道有什么方法能够恢复旧版记事本&#xff1f;首先需要打开Win11系统设置选项&#xff0c;点击关闭记事本选项&#xff0c;然后从Windows文件夹或使用notepad命令来打开旧记事本。以下系统之家小编给…

探索Facebook的区块链计划:未来社交网络的变革

随着区块链技术的迅速发展&#xff0c;社交网络领域正面临一场深刻的变革。Facebook&#xff0c;作为全球最大且最具影响力的社交平台之一&#xff0c;正在积极探索区块链技术的应用。本文将深入探讨Facebook的区块链计划&#xff0c;分析其潜在的变革性影响&#xff0c;并展望…

2024年新SCI顶刊算法信息获取优化算法IAO优化Transformer-GRU模型的多变量时间序列预测

matlab R2024a以上 一、数据集 ​ ​ 二、2024年新SCI顶刊算法信息获取优化算法IAO 本期介绍了一种名为信息获取优化算法Information acquisition optimizer&#xff0c;IAO的元启发式算法。该算法受人类信息获取行为的启发&#xff0c;由信息收集、信息过滤和评估以及信息分…

A286螺栓产品特性及主要应用领域

A286螺栓是一种采用A286合金制成的高性能紧固件&#xff0c;具有优异的高温强度、耐腐蚀性能以及良好的加工性能。下面是关于A286螺栓的产品特性和主要应用领域的详细介绍。 产品特性 高温强度&#xff1a;A286合金在高温下仍能保持较高的机械强度&#xff0c;适用于高温环境下…

iOS Forensics with Belkasoft

本课程专为需要在工作中处理 iOS 设备并希望增强知识并获得 iOS 获取和分析实践经验的数字取证调查员而设计。 您将学到什么&#xff1f; 如何使用 iOS 获取的基本和高级方法&#xff0c;例如基于 checkm8 和基于代理的获取 如何从云端获取 iOS 数据 如何分析 iOS 应用程序&…

《黑神话:悟空》引爆全球,AI揭秘中国古建之美

在数字化浪潮的推动下&#xff0c;人工智能&#xff08;AI&#xff09;正成为塑造未来的关键力量。硅纪元视角栏目紧跟AI科技的最新发展&#xff0c;捕捉行业动态&#xff1b;提供深入的新闻解读&#xff0c;助您洞悉技术背后的逻辑&#xff1b;汇聚行业专家的见解&#xff0c;…

C++第三十九弹---C++ STL中的无序容器:unordered_set与unordered_map使用详解

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1 unordered_set 1.1 unordered_set的接口说明 1.1.1 unordered_set的构造 1.1.2. unordered_set的容量 1.1.3. unordered_set的迭代器 1.1…