探索算法系列 - 双指针

目录

移动零(原题链接)

复写零(原题链接)

快乐数(原题链接)

盛最多水的容器(原题链接)

有效三角形的个数(原题链接)

查找总价格为目标值的两个商品(原题链接)

三数之和(原题链接)

四数之和(原题链接)


移动零(原题链接)

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

请注意 ,必须在不复制数组的情况下原地对数组进行操作。

解题思路

  • 定义两个指针 cur 和 dest
  • cur 用于遍历整个数组。
  • dest 指向下一个非零元素应该放置的位置。
  • 初始化 dest 为 -1,这是因为我们需要在第一次找到非零元素时将其值赋给 dest 并且增加 dest 的值。

步骤说明

  1. 初始化

    • cur 从0开始。
    • dest 从-1开始(表示还没有遇到非零元素)。
  2. 遍历数组

    • 使用循环遍历整个数组 nums
    • 对于数组中的每一个元素 nums[cur],检查它是否是非零元素。
      • 如果 nums[cur] 不为0,则执行以下操作:
        • 将 dest 加1。
        • 交换 nums[dest] 和 nums[cur] 的值。
  3. 结束条件

    • 当 cur 遍历完整个数组后,循环结束。
  4. 结果

    • 所有的非零元素都已经被移动到了数组的前半部分,并保持了原有的顺序。
    • 所有的0元素都被移动到了数组的后半部分。

具体代码

class Solution 
{
public:void moveZeroes(vector<int>& nums){for (int cur = 0, dest = -1; cur < nums.size(); cur++){if (nums[cur]){swap(nums[++dest], nums[cur]);}}}
};

复写零(原题链接)

给你一个长度固定的整数数组 arr ,请你将该数组中出现的每个零都复写一遍,并将其余的元素向右平移。

注意:请不要在超过该数组长度的位置写入元素。请对输入的数组 就地 进行上述修改,不要从函数返回任何东西。

解题思路

  • 初始化变量

  • 预处理

  • 复制与调整

步骤说明

  1. 初始化

    • cur 从0开始。
    • dest 从-1开始。
    • n 是数组的长度。
  2. 预处理

    • 使用循环遍历整个数组 arr
    • 如果 arr[cur] 是0,则 dest 增加2;否则,dest 增加1。
    • 如果 dest 大于等于 n-1,则退出循环。
  3. 特殊情况处理

    • 如果 dest 等于 n,说明最后一个位置应该是一个复制的0元素,需要将最后一个元素设置为0,并减少 dest 的值以确保不会超出数组长度。
    • 减少 cur 的值以便在接下来的步骤中重新处理这个位置。
  4. 复制与调整

    • 从 cur 开始向左遍历数组。
    • 如果 arr[cur] 不为0,则直接将 arr[cur] 复制到 dest 的位置。
    • 如果 arr[cur] 为0,则需要复制两次0元素到 dest 的位置。
    • 在每一步之后减少 dest 的值,并且每次循环结束后减少 cur 的值。
  5. 结束条件

    • 当 cur 小于0 时,循环结束。

具体代码

class Solution
{
public:void duplicateZeros(vector<int>& arr){int cur = 0, dest = -1, n = arr.size();while (cur < n){if (arr[cur])dest++;elsedest += 2;if (dest >= n - 1)break;cur++;}if (dest == n){arr[n - 1] = 0;cur--;dest -= 2;}while (cur >= 0){if (arr[cur])arr[dest--] = arr[cur--];else{arr[dest--] = 0;arr[dest--] = 0;cur--;}}}
};

快乐数(原题链接)

编写一个算法来判断一个数 n 是不是快乐数。

「快乐数」 定义为:

  • 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
  • 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
  • 如果这个过程 结果为 1,那么这个数就是快乐数。

如果 n 是 快乐数 就返回 true ;不是,则返回 false 。

首先我们先证明:

        对于任意正整数,通过上述过程要么最终变为 1,要么进入一个循环,而不会出现其他情况。(鸽巢原理)

证明过程

  1. 有限性

    • 假设初始数为 𝑛n,且 𝑛n 有 𝑑d 位数字。
    • 每次迭代产生的新数的最大值是 𝑑×81d×81,这是因为每一位上的数字最大是 9,而 92=8192=81。
    • 因此,无论初始数有多大,经过若干次迭代后,得到的数将不会超过 𝑑×81d×81。
  2. 循环检测

    • 既然每次迭代产生的数都是有限集合内的一个数,那么随着迭代次数的增加,必然会出现重复的数。
    • 当重复出现时,就会形成一个循环,因为一旦出现了一个数,之后的迭代结果将完全由之前的数决定,形成一个闭环。
  3. 唯一循环

    • 如果一个数 𝑛n 通过上述过程变成了 1,那么它就是一个快乐数。
    • 如果一个数进入了循环,而循环中没有 1,那么这个数就是一个不快乐数。
    • 除了 1 之外,所有可能的循环都是有限的,因为生成的数总是有限集合内的一个数。

 解题思路

  • 定义辅助函数 bitSum:计算一个数各位数字的平方和。
  • 使用快慢指针法 isHappy:通过快慢指针法检测循环,判断是否为快乐数。

步骤说明

  1. 初始化变量 slow 和 fast
    • slow 初始化为 n
    • fast 初始化为 bitSum(n),即对 n 应用一次 bitSum 函数的结果。
  2. 使用快慢指针法检测循环
    • 在 slow 和 fast 不相等的情况下,继续执行循环。
    • 在每次循环中:
      • 更新 slow 为 bitSum(slow),即对 slow 应用一次 bitSum 函数。
      • 更新 fast 为 bitSum(bitSum(fast)),即对 fast 应用两次 bitSum 函数。
  3. 判断是否为快乐数
    • 如果 slow 和 fast 最终相等,并且等于 1,则 n 是快乐数。
    • 如果 slow 和 fast 最终相等但不等于 1,则 n 不是快乐数,因为它进入了循环。

具体代码

class Solution 
{
public:int bitSum(int n){int sum = 0;while(n){int t = n % 10;sum += t * t;n /= 10;}return sum;}bool isHappy(int n) {int slow = n,fast = bitSum(n);while(slow != fast){slow = bitSum(slow);fast = bitSum(bitSum(fast));}return slow == 1;}
};

盛最多水的容器(原题链接)

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。

找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

返回容器可以储存的最大水量。

说明:你不能倾斜容器。

解题思路

  • 双指针法:使用两个指针 left 和 right,分别指向数组的起始位置和结束位置。
  • 计算面积:每次计算由 left 和 right 指向的两条线形成的容器面积。
  • 更新最大面积:记录每次计算的最大面积。
  • 移动指针:根据高度较小的一侧来移动指针,以寻找可能更大的面积。

步骤说明

  1. 初始化变量 left 和 right 分别指向数组的首尾,ret 用于记录最大的面积。
  2. 循环条件:当 left 小于 right 时,继续执行循环。
  3. 计算面积
    • 计算当前容器的面积 v,面积由较短边的高度和两线间的距离决定:v = min(height[left], height[right]) * (right - left)
    • 更新 ret 为当前面积 v 和已记录的最大面积 ret 中较大的那个值。
  4. 移动指针
    • 如果 height[left] 小于 height[right],则将 left 向右移动一位。
    • 否则,将 right 向左移动一位。
  5. 循环结束:当 left 不再小于 right 时,循环结束。
  6. 返回结果 ret

具体代码 

class Solution 
{
public:int maxArea(vector<int>& height) {int left = 0, right = height.size() - 1, ret = 0;while(left < right){int v = min(height[left], height[right]) * (right - left);ret = max(ret, v);if(height[left] < height[right])left++;elseright--;}return ret;}
};

有效三角形的个数(原题链接)

给定一个包含非负整数的数组 nums ,返回其中可以组成三角形三条边的三元组个数。

解题思路

  • 排序:首先对数组进行排序。
  • 双指针法:使用两个指针 left 和 right,分别指向数组的起始位置和当前遍历位置的前一个位置。
  • 遍历:从数组的末尾开始遍历,每次选取一个数作为最长边。
  • 条件判断:根据构成三角形的条件,移动 left 和 right 指针来寻找所有可能的组合。

步骤说明

  1. 排序:

    • 使用 sort 函数对输入数组 nums 进行升序排序。
  2. 初始化变量:

    • ret 用于记录满足条件的组合数量。
    • n 是数组的长度。
  3. 遍历数组:

    • 从数组的末尾开始,即从最长的边开始遍历。
    • 使用循环变量 i 从 n - 1 开始递减到 2(因为至少需要三个数才能构成三角形)。
  4. 双指针法:

    • 在每次循环中,使用两个指针 left 和 right,分别初始化为 0 和 i - 1
    • 使用内部循环,当 left 小于 right 时,继续执行循环。
    • 根据构成三角形的条件(两边之和大于第三边),进行如下操作:
      • 如果 nums[left] + nums[right] > nums[i],则满足条件,此时所有位于 left 和 right 之间的数都可以与 nums[left] 和 nums[i] 构成三角形,因此加上 right - left 的数量。
      • 如果不满足条件,则将 left 向右移动一位,尝试更大的数。
      • 如果满足条件,则将 right 向左移动一位,尝试较小的数。
  5. 返回结果:

    • 返回 ret,即满足条件的组合数量。

具体代码 

class Solution 
{
public:int triangleNumber(vector<int>& nums) {sort(nums.begin(), nums.end());int ret = 0, n = nums.size();for(int i = n - 1; i >= 2; i--){int left = 0, right = i - 1;while(left < right){if(nums[left] + nums[right] > nums[i]){ret += right - left;right--;}else{left++;}}}return ret;}
};

查找总价格为目标值的两个商品(原题链接)

购物车内的商品价格按照升序记录于数组 price。请在购物车中找到两个商品的价格总和刚好是 target。若存在多种情况,返回任一结果即可。

解题思路

  • 双指针法:使用两个指针 left 和 right,分别指向数组的起始位置和结束位置。
  • 计算和:每次计算由 left 和 right 指向的两个数的和。
  • 更新指针:根据和与目标值的关系来更新指针。
  • 返回结果:如果找到了符合条件的两个数,则返回这两个数;否则,返回 { -1, -1 }

步骤说明

  1. 初始化变量 left 和 right 分别指向数组的首尾。
  2. 循环条件:当 left 小于 right 时,继续执行循环。
  3. 计算和
    • 计算当前和 sumsum = price[left] + price[right]
  4. 更新指针
    • 如果 sum 大于 target,则将 right 向左移动一位。
    • 如果 sum 小于 target,则将 left 向右移动一位。
    • 如果 sum 等于 target,则找到了符合条件的两个数,返回这两个数。
  5. 循环结束:当 left 不再小于 right 时,循环结束。
  6. 返回结果:如果没有找到符合条件的两个数,则返回 { -1, -1 }

 具体代码

class Solution 
{
public:vector<int> twoSum(vector<int>& price, int target) {int left = 0, right = price.size() - 1;while(left < right){int sum = price[left] + price[right];if(sum > target)right--;else if(sum < target)left++;elsereturn {price[left], price[right]};}return {-1,-1};}
};

三数之和(原题链接)

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != ji != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。

注意:答案中不可以包含重复的三元组。

解题思路

  • 排序:首先对数组进行排序。
  • 双指针法:使用两个指针 left 和 right,分别指向数组的当前位置的后一个位置和数组的末尾。
  • 遍历:从数组的开头开始遍历,每次选取一个数作为第一个数。
  • 条件判断:根据和为 0 的条件,移动 left 和 right 指针来寻找所有可能的组合。
  • 去重:在遍历过程中,跳过重复的元素以避免重复的组合。

步骤说明

  1. 排序:

    • 使用 sort 函数对输入数组 nums 进行升序排序。
  2. 初始化变量:

    • ret 用于记录满足条件的组合。
    • n 是数组的长度。
  3. 遍历数组:

    • 从数组的开头开始遍历,使用循环变量 i
    • 当 nums[i] 大于 0 时,提前结束遍历(因为之后的组合肯定大于 0)。
  4. 双指针法:

    • 在每次循环中,使用两个指针 left 和 right,分别初始化为 i + 1 和 n - 1
    • 使用内部循环,当 left 小于 right 时,继续执行循环。
    • 计算和 sumsum = nums[left] + nums[right]
    • 根据和与目标值 0 的关系,进行如下操作:
      • 如果 sum 大于 0,则将 right 向左移动一位。
      • 如果 sum 小于 0,则将 left 向右移动一位。
      • 如果 sum 等于 0,则将当前组合加入到结果中,并移动指针以寻找下一个可能的组合。
      • 在找到有效的组合后,需要跳过重复的元素,以避免重复的组合。
  5. 返回结果:

    • 返回 ret,即满足条件的组合列表。

具体代码 

class Solution
{
public:vector<vector<int>> threeSum(vector<int>& nums){vector<vector<int>> ret;sort(nums.begin(), nums.end());int n = nums.size();for (int i = 0; i < n; ){if (nums[i] > 0)break;int left = i + 1, right = n - 1, target = -nums[i];while (left < right){int sum = nums[left] + nums[right];if (sum > target)right--;else if (sum < target)left++;else{ret.push_back({ nums[i], nums[right], nums[left] });left++, right--;while (left < right && nums[left] == nums[left - 1])left++;while (left < right && nums[right] == nums[right + 1])right--;}}i++;while (i < n && nums[i] == nums[i - 1])i++;}return ret;}
};

四数之和(原题链接)

给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。

请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):

  • 0 <= a, b, c, d < n
  • abc 和 d 互不相同
  • nums[a] + nums[b] + nums[c] + nums[d] == target

你可以按 任意顺序 返回答案 。

 解题思路

  • 排序:首先对数组进行排序。
  • 双指针法:使用两个指针 left 和 right,分别指向数组的当前位置的后一个位置和数组的末尾。
  • 嵌套循环:使用两层嵌套循环,外层循环遍历数组中的两个数,内层使用双指针法寻找另外两个数,使得四数之和等于目标值。
  • 去重:在遍历过程中,跳过重复的元素以避免重复的组合。

步骤说明

  1. 排序:

    • 使用 sort 函数对输入数组 nums 进行升序排序。
  2. 初始化变量:

    • ret 用于记录满足条件的组合。
    • n 是数组的长度。
  3. 外层循环:

    • 从数组的开头开始遍历,使用循环变量 i
    • 内层循环遍历数组中的第二个数,使用循环变量 j
  4. 双指针法:

    • 在每次内外层循环中,使用两个指针 left 和 right,分别初始化为 j + 1 和 n - 1
    • 使用内部循环,当 left 小于 right 时,继续执行循环。
    • 计算和 sumsum = nums[left] + nums[right]
    • 根据和与目标值 target 的关系,进行如下操作:
      • 如果 sum 小于 target - nums[i] - nums[j],则将 left 向右移动一位。
      • 如果 sum 大于 target - nums[i] - nums[j],则将 right 向左移动一位。
      • 如果 sum 等于 target - nums[i] - nums[j],则将当前组合加入到结果中,并移动指针以寻找下一个可能的组合。
      • 在找到有效的组合后,需要跳过重复的元素,以避免重复的组合。
  5. 返回结果:

    • 返回 ret,即满足条件的组合列表。

具体代码 

class Solution 
{
public:vector<vector<int>> fourSum(vector<int>& nums, int target) {vector<vector<int>> ret;sort(nums.begin(), nums.end());int n = nums.size();for(int i = 0; i < n; ){for(int j = i + 1; j < n; ){int  left = j + 1, right = n - 1;long long aim = (long long)target - nums[i] - nums[j];while(left < right){int sum = nums[left] + nums[right];if(sum < aim)left++;else if(sum > aim)right--;else{ret.push_back({nums[i], nums[j], nums[left], nums[right]});left++, right--;while (left < right && nums[left] == nums[left - 1])left++;while (left < right && nums[right] == nums[right + 1])right--;}}j++;while(j < n && nums[j] == nums[j-1])j++;}i++;while(i < n && nums[i] == nums[i - 1])i++;}return ret;}
};

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

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

相关文章

优化算法:2.粒子群算法(PSO)及Python实现

一、定义 粒子群算法&#xff08;Particle Swarm Optimization&#xff0c;PSO&#xff09;是一种模拟鸟群觅食行为的优化算法。想象一群鸟在寻找食物&#xff0c;每只鸟都在尝试找到食物最多的位置。它们通过互相交流信息&#xff0c;逐渐向食物最多的地方聚集。PSO就是基于这…

【python_将一个列表中的几个字典改成二维列表,并删除不需要的列】

def 将一个列表中的几个字典改成二维列表(original_list,headersToRemove_list):# 初始化一个列表用于存储遇到的键&#xff0c;保持顺序ordered_keys []# 遍历data中的每个字典&#xff0c;添加其键到ordered_keys&#xff0c;如果该键还未被添加for d in original_list:for …

P4009 汽车加油行驶问题题解

P4009 汽车加油行驶问题 紫题&#xff0c;但是DFS。 思路 记忆化搜索&#xff0c;分多钟情况去搜索。 注意该题不用标记&#xff0c;有可能会往回走。 有可能这样走。 代码 #include<bits/stdc.h> #include<cstring> #include<queue> #include<set&g…

redis:清除缓存的最简单命令示例

清除redis缓存命令(执行命令列表见截图) 1.打开cmd窗口&#xff0c;并cd进入redis所在目录 2.登录redis redis-cli 3.查询指定队列当前的记录数 llen 队列名称 4.清除指定队列所有记录 ltrim 队列名称 1 0 5.再次查询&#xff0c;确认队列的记录数是否已清除

配置和连接另一台电脑上的 MySQL 数据库

要配置和连接另一台电脑上的 MySQL 数据库&#xff0c;可以按照以下步骤进行设置&#xff1a; 1. 配置 MySQL 服务器 在目标计算机上&#xff08;192.168.10.103&#xff09;进行以下操作&#xff1a; 修改 MySQL 配置文件&#xff1a; 打开 MySQL 配置文件&#xff08;通常位…

【系统架构设计师】十八、信息系统架构设计理论与实践①

目录 一、信息系统架构概述 二、信息系统架构风格与分类 2.1 信息系统架构风格 2.2 信息系统架构分类 三、信息系统架构模型 3.1 单体应用 3.2 客户机/服务器 3.2.1 二层 C/S 3.2.2 三层 C/S 和 B/S 3.2.3 多层 C/S 和 B/S 3.2.4 MVC 3.3 面向服务架构(SOA)模式 …

Activiti 本地画流程 http://localhost:8080/activiti-app/#/

http://localhost:8080/activiti-app/#/ 1、本地安装了Tomcat 2、本地安装了Activiti 3、拷贝Activiti中这两个文件到Tomcat中的webapps目录下 4、启动startu.bat 5、http://localhost:8080/activiti-app/#/ 账号&#xff1a;admin 密码&#xff1a;test

乐鑫 Matter 技术体验日回顾|全面 Matter 解决方案驱动智能家居新未来

日前&#xff0c;乐鑫信息科技 (688018.SH) 在深圳成功举办了 Matter 方案技术体验日活动&#xff0c;吸引了众多照明电工、窗帘电机、智能门锁、温控等智能家居领域的客户与合作伙伴。活动现场&#xff0c;乐鑫产研团队的小伙伴们与来宾围绕 Matter 产品研发、测试认证、生产工…

Python学习笔记46:游戏篇之外星人入侵(七)

前言 到目前为止&#xff0c;我们已经完成了游戏窗口的创建&#xff0c;飞船的加载&#xff0c;飞船的移动&#xff0c;发射子弹等功能。很高兴的说一声&#xff0c;基础的游戏功能已经完成一半了&#xff0c;再过几天我们就可以尝试驾驶 飞船击毁外星人了。当然&#xff0c;计…

解析西门子PLC的String和WString

西门子PLC有两种字符串类型&#xff0c;String与WString String 用于存放英文数字标点符号等ASCII字符&#xff0c;每个字符占用一个字节 WString宽字符串用于存放中文、英文、数字等Unicode字符&#xff0c;每个字符占用两个字节 之前我搞过一篇解析String的 关于使用TCP-…

Vue3 Pinia的创建与使用代替Vuex 全局数据共享 同步异步

介绍 提供跨组件和页面的共享状态能力&#xff0c;作为Vuex的替代品&#xff0c;专为Vue3设计的状态管理库。 Vuex&#xff1a;在Vuex中&#xff0c;更改状态必须通过Mutation或Action完成&#xff0c;手动触发更新。Pinia&#xff1a;Pinia的状态是响应式的&#xff0c;当状…

Linux内核 mmap内存映射的实现原理

在Linux内核以及Linux系统编程的时候&#xff0c;经常会碰到mmap内存映射&#xff0c;mmap函数是实现高性能编程的一个关键点。本文详细介绍一下mmap实现原理。 虚拟地址映射物理地址 虚拟地址映射物理地址采用的是页表机制&#xff0c;64位CPU采用的是4级页表。 64位CPU虚拟…

鸿蒙 HarmonyOS NEXT端云一体化开发-认证服务篇

一、开通认证服务 地址&#xff1a;AppGallery Connect (huawei.com) 步骤&#xff1a; 1 进入到项目设置页面中&#xff0c;并点击左侧菜单中的认证服务 2 选择需要开通的服务并开通二、端侧项目环境配置 添加依赖 entry目录下的oh-package.json5 // 添加&#xff1a;主要前…

《python程序语言设计》第6章14题 估算派值 类似莱布尼茨函数。但是我看不明白

这个题提供的公式我没看明白&#xff0c;后来在网上找到了莱布尼茨函数 c 0 for i in range(1, 902, 100):a (-1) ** (i 1)b 2 * i - 1c a / bprint(i, round(4 / c, 3))结果 #按题里的信息&#xff0c;但是结果不对&#xff0c;莱布尼茨函数到底怎么算呀。

PyTorch深度学习快速入门(上)

PyTorch深度学习快速入门&#xff08;上&#xff09; 一、前言&#xff08;一&#xff09;PyTorch环境配置&#xff08;二&#xff09;Python编译器的选择&#xff08;三&#xff09;Python学习中的两大法宝函数 二、如何加载数据&#xff08;一&#xff09;Dataset与Dataloade…

轻松学EntityFramework Core--模型创建

一、使用代码优先&#xff08;Code-First&#xff09;创建模型 Code-First 方法是 EF Core 提供的一种用于定义模型的方式&#xff0c;它允许开发人员通过编写 C# 类来定义数据库模式&#xff0c;再通过迁移命令生成数据库表。下面我们来一起看一下代码优先如何使用。 1.1、创…

lua 游戏架构 之 游戏 AI (六)ai_auto_skill

定义一个为ai_auto_skill的类&#xff0c;继承自ai_base类。ai_auto_skill类的目的是在AI自动战斗模式下&#xff0c;根据配置和条件自动选择并使用技能。 lua 游戏架构 之 游戏 AI &#xff08;一&#xff09;ai_base-CSDN博客文章浏览阅读379次。定义了一套接口和属性&#…

【原创】使用keepalived虚拟IP(VIP)实现MySQL的高可用故障转移

1. 背景 A、B服务器均部署有MySQL数据库&#xff0c;且互为主主。此处为A、B服务器部署MySQL数据库实现高可用的部署&#xff0c;当其中一台MySQL宕机后&#xff0c;VIP可自动切换至另一台MySQL提供服务&#xff0c;实现故障的自动迁移&#xff0c;实现高可用的目的。具体流程…

快速安装torch-gpu和Tensorflow-gpu(自用,Ubuntu)

要更详细的教程可以参考Tensorflow PyTorch 安装&#xff08;CPU GPU 版本&#xff09;&#xff0c;这里是有基础之后的快速安装。 一、Pytorch 安装 conda create -n torch_env python3.10.13 conda activate torch_env conda install cudatoolkit11.8 -c nvidia pip ins…

mstc远程连接不锁屏

连接不锁屏 方法一 方法二 win10 解决多用户同时远程连接教程&#xff08;超详细图文&#xff09;_win10多用户登录-CSDN博客 win7软件 logout.bat for /f "skip1 tokens3" %%s in (query user %USERNAME%) do (%windir%\System32\tscon.exe %%s /dest:console) …