代码随想录-Day42

1049. 最后一块石头的重量 II

有一堆石头,用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。

每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下:

如果 x == y,那么两块石头都会被完全粉碎;
如果 x != y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x。
最后,最多只会剩下一块 石头。返回此石头 最小的可能重量 。如果没有石头剩下,就返回 0。

示例 1:

输入:stones = [2,7,4,1,8,1]
输出:1
解释:
组合 2 和 4,得到 2,所以数组转化为 [2,7,1,8,1],
组合 7 和 8,得到 1,所以数组转化为 [2,1,1,1],
组合 2 和 1,得到 1,所以数组转化为 [1,1,1],
组合 1 和 1,得到 0,所以数组转化为 [1],这就是最优值。
示例 2:

输入:stones = [31,26,33,21,40]
输出:5
在这里插入图片描述

方法一:一维数组

class Solution {public int lastStoneWeightII(int[] stones) {int sum = 0;for (int i : stones) {sum += i;}int target = sum >> 1;//初始化dp数组int[] dp = new int[target + 1];for (int i = 0; i < stones.length; i++) {//采用倒序for (int j = target; j >= stones[i]; j--) {//两种情况,要么放,要么不放dp[j] = Math.max(dp[j], dp[j - stones[i]] + stones[i]);}}return sum - 2 * dp[target];}
}

这段Java代码是一个解决方案,用于解决“最后的石头重量II”问题。这个问题源于LeetCode上的1049题。问题是这样的:有一堆石头,每个石头有一定的重量。在每一轮操作中,你可以选择任意两块石头然后将它们一起粉碎,新石头的重量等于两者之差的绝对值。最终,所有的石头都会变成一堆石头,而最后一块石头的重量就是这些石头的重量之和。任务是找到一种操作策略,使得最后这块石头的重量尽可能小。

代码解析

  1. 计算总重量:首先,遍历输入数组stones,计算所有石头的总重量,并存储在变量sum中。

  2. 确定目标重量:因为最终目标是最小化两堆石头重量之差,所以理论上最优情况是一堆石头的总重量尽可能接近总重量的一半。因此,设定目标重量targetsum除以2(使用右移运算符>> 1等同于除以2,用于快速整除)。

  3. 初始化动态规划数组:创建一个长度为target + 1的数组dp,用于动态规划计算。dp[j]表示能否通过选择某些石头使总重量达到j,并且这个总重量尽可能接近target

  4. 填充动态规划数组

    • 双层循环遍历每个石头和每个可能的目标重量。外层循环遍历石头,内层循环从target反向遍历到当前石头的重量。这是因为在考虑加入当前石头时,我们总是从最大的可能贡献开始尝试(即直接达到或接近目标重量)。
    • 对于每个石头,如果它不超重(即j >= stones[i]),则更新dp[j]为不包含当前石头能达到的最大重量dp[j]与包含当前石头能达到的新重量dp[j - stones[i]] + stones[i]之间的较大值。这体现了动态规划中的决策过程:要么选取当前石头,要么不选取。
  5. 计算结果:最后,由于dp[target]代表了最接近sum/2的最大可能重量,因此两堆石头的重量之差即为sum - 2 * dp[target]。这是因为总重量是sum,最优情况下两堆重量尽量平衡,即一边为dp[target],另一边为sum - dp[target],但为了求差值最小,我们直接用总重量减去两倍的dp[target]

小结

这段代码通过动态规划的方法,有效地解决了“最后的石头重量II”问题,寻找了一种策略来最小化最终剩余石头的重量。

方法二:二维数组

class Solution {public int lastStoneWeightII(int[] stones) {int sum = 0;for (int s : stones) {sum += s;}int target = sum / 2;//初始化,dp[i][j]为可以放0-i物品,背包容量为j的情况下背包中的最大价值int[][] dp = new int[stones.length][target + 1];//dp[i][0]默认初始化为0//dp[0][j]取决于stones[0]for (int j = stones[0]; j <= target; j++) {dp[0][j] = stones[0];}for (int i = 1; i < stones.length; i++) {for (int j = 1; j <= target; j++) {//注意是等于if (j >= stones[i]) {//不放:dp[i - 1][j] 放:dp[i - 1][j - stones[i]] + stones[i]dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - stones[i]] + stones[i]);} else {dp[i][j] = dp[i - 1][j];}}}System.out.println(dp[stones.length - 1][target]);return (sum - dp[stones.length - 1][target]) - dp[stones.length - 1][target];}
}

这段代码实现了一个解决“最后一块石头的重量 II”问题的算法。这个问题可以转换成一个背包问题,下面是对代码的详细解释:

题目描述

有一堆石头,每个石头都有一个正整数的重量。每次选择两块石头进行碰撞,重量大的石头会减少重量小的石头的重量。最后剩下的石头最小可能的重量是多少?

解决思路

将石头分成两堆,使得两堆的重量差最小。为了实现这个目标,我们可以将这个问题看作是一个“0/1 背包问题”。

代码解释

  1. 计算总重量 sum

    int sum = 0;
    for (int s : stones) {sum += s;
    }
    

    计算所有石头的总重量 sum

  2. 计算目标重量 target

    int target = sum / 2;
    

    计算背包容量的目标值 target,即总重量的一半。这是为了尽量使两堆石头的重量接近。

  3. 初始化动态规划数组 dp

    int[][] dp = new int[stones.length][target + 1];
    

    创建一个二维数组 dpdp[i][j] 表示前 i 个石头中能够放入容量为 j 的背包中的最大重量。

  4. 初始化第一行

    for (int j = stones[0]; j <= target; j++) {dp[0][j] = stones[0];
    }
    

    初始化第一行,即只考虑第一个石头。如果背包容量大于等于第一个石头的重量,那么可以放入这个石头。

  5. 填充动态规划数组 dp

    for (int i = 1; i < stones.length; i++) {for (int j = 1; j <= target; j++) {if (j >= stones[i]) {dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - stones[i]] + stones[i]);} else {dp[i][j] = dp[i - 1][j];}}
    }
    

    填充 dp 数组。对于每个石头 i 和每个可能的背包容量 j,我们有两种选择:

    • 不放入当前石头:dp[i - 1][j]
    • 放入当前石头:dp[i - 1][j - stones[i]] + stones[i]
      取两者的最大值。
  6. 计算并返回结果

    return (sum - dp[stones.length - 1][target]) - dp[stones.length - 1][target];
    

    最后计算两个堆的重量差并返回。sum - dp[stones.length - 1][target] 是剩下的石头的总重量,减去 dp[stones.length - 1][target],得到最小的剩余重量。

总结

这段代码通过动态规划解决了“最后一块石头的重量 II”的问题。它将石头分成两堆,使得两堆的重量差最小,从而得到最小的剩余重量。

494. 目标和

给你一个非负整数数组 nums 和一个整数 target 。

向数组中的每个整数前添加 ‘+’ 或 ‘-’ ,然后串联起所有整数,可以构造一个 表达式 :

例如,nums = [2, 1] ,可以在 2 之前添加 ‘+’ ,在 1 之前添加 ‘-’ ,然后串联起来得到表达式 “+2-1” 。
返回可以通过上述方法构造的、运算结果等于 target 的不同 表达式 的数目。

示例 1:

输入:nums = [1,1,1,1,1], target = 3
输出:5
解释:一共有 5 种方法让最终目标和为 3 。
-1 + 1 + 1 + 1 + 1 = 3
+1 - 1 + 1 + 1 + 1 = 3
+1 + 1 - 1 + 1 + 1 = 3
+1 + 1 + 1 - 1 + 1 = 3
+1 + 1 + 1 + 1 - 1 = 3
示例 2:

输入:nums = [1], target = 1
输出:1
在这里插入图片描述

方法一:

class Solution {public int findTargetSumWays(int[] nums, int target) {int sum = 0;for (int i = 0; i < nums.length; i++) sum += nums[i];//如果target的绝对值大于sum,那么是没有方案的if (Math.abs(target) > sum) return 0;//如果(target+sum)除以2的余数不为0,也是没有方案的if ((target + sum) % 2 == 1) return 0;int bagSize = (target + sum) / 2;int[] dp = new int[bagSize + 1];dp[0] = 1;for (int i = 0; i < nums.length; i++) {for (int j = bagSize; j >= nums[i]; j--) {dp[j] += dp[j - nums[i]];}}return dp[bagSize];}
}

这段代码实现了一个解决“目标和”问题的算法。题目要求是找到一种加减运算,使得数组中的元素的和等于目标值 target。这是一个变形的背包问题,下面是对代码的详细解释:

题目描述

给定一个整数数组 nums 和一个整数 target,求在数组中添加 +- 符号,使得计算结果等于 target 的方法数。

解决思路

将数组划分为两个子集,使得一个子集的和减去另一个子集的和等于目标值 target。设这两个子集分别为 PN。那么有以下关系:

[ P - N = \text{target} ]
[ P + N = \text{sum} ]

通过这两个方程可以得到:

[ 2P = \text{target} + \text{sum} ]

因此,问题转换为在数组中找到一个子集 P,使得 P 的和等于 (target + sum) / 2

代码解释

  1. 计算数组总和 sum

    int sum = 0;
    for (int i = 0; i < nums.length; i++) sum += nums[i];
    
  2. 特殊情况处理

    if (Math.abs(target) > sum) return 0;
    if ((target + sum) % 2 == 1) return 0;
    
    • 如果 target 的绝对值大于 sum,那么无法通过加减运算得到 target
    • 如果 (target + sum) 不是偶数,也无法找到一个整数子集和使得 P 等于 (target + sum) / 2
  3. 计算背包容量 bagSize

    int bagSize = (target + sum) / 2;
    
  4. 初始化动态规划数组 dp

    int[] dp = new int[bagSize + 1];
    dp[0] = 1;
    

    dp[j] 表示和为 j 的子集数目。初始时,和为 0 的子集只有一个,即空集。

  5. 填充动态规划数组 dp

    for (int i = 0; i < nums.length; i++) {for (int j = bagSize; j >= nums[i]; j--) {dp[j] += dp[j - nums[i]];}
    }
    
    • 遍历每个数字 nums[i]
    • 更新 dp 数组,从后向前遍历,确保每个数字只使用一次。
    • dp[j] += dp[j - nums[i]] 表示当前数字 nums[i] 可以加入和为 j - nums[i] 的子集,形成和为 j 的子集。
  6. 返回结果

    return dp[bagSize];
    

    返回和为 bagSize 的子集数目,即满足条件的方案数。

总结

这段代码通过将问题转换为背包问题,使用动态规划求解目标和问题。通过判断特殊情况、计算背包容量和填充动态规划数组,最终得到了满足条件的方案数。

方法二:二维数组

class Solution {public int findTargetSumWays(int[] nums, int target) {// 01背包应用之“有多少种不同的填满背包最大容量的方法“// 易于理解的二维数组解法及详细注释int sum = 0;for(int i = 0; i < nums.length; i++) {sum += nums[i];}// 注意nums[i] >= 0的题目条件,意味着sum也是所有nums[i]的绝对值之和// 这里保证了sum + target一定是大于等于零的,也就是left大于等于零(毕竟我们定义left大于right)if(sum < Math.abs(target)){return 0;}// 利用二元一次方程组将left用target和sum表示出来(替换掉right组合),详见代码随想录对此题的分析// 如果所求的left数组和为小数,则作为整数数组的nums里的任何元素自然是没有办法凑出这个小数的if((sum + target) % 2 != 0) {return 0;}int left = (sum + target) / 2;// dp[i][j]:遍历到数组第i个数时, left为j时的能装满背包的方法总数int[][] dp = new int[nums.length][left + 1];// 初始化最上行(dp[0][j]),当nums[0] == j时(注意nums[0]和j都一定是大于等于零的,因此不需要判断等于-j时的情况),有唯一一种取法可取到j,dp[0][j]此时等于1// 其他情况dp[0][j] = 0// java整数数组默认初始值为0if (nums[0] <= left) {dp[0][nums[0]] = 1;}// 初始化最左列(dp[i][0])// 当从nums数组的索引0到i的部分有n个0时(n > 0),每个0可以取+/-,因此有2的n次方中可以取到j = 0的方案// n = 0说明当前遍历到的数组部分没有0全为正数,因此只有一种方案可以取到j = 0(就是所有数都不取)int numZeros = 0;for(int i = 0; i < nums.length; i++) {if(nums[i] == 0) {numZeros++;}dp[i][0] = (int) Math.pow(2, numZeros);}// 递推公式分析:// 当nums[i] > j时,这时候nums[i]一定不能取,所以是dp[i - 1][j]种方案数// nums[i] <= j时,num[i]可取可不取,因此方案数是dp[i - 1][j] + dp[i - 1][j - nums[i]]// 由递推公式可知,先遍历i或j都可for(int i = 1; i < nums.length; i++) {for(int j = 1; j <= left; j++) {if(nums[i] > j) {dp[i][j] = dp[i - 1][j];} else {dp[i][j] = dp[i - 1][j] + dp[i - 1][j - nums[i]];}}}// 打印dp数组// for(int i = 0; i < nums.length; i++) {//     for(int j = 0; j <= left; j++) {//         System.out.print(dp[i][j] + " ");//     }//     System.out.println("");// }return dp[nums.length - 1][left];}
}

这段代码实现了一个解决“目标和”问题的算法,使用二维动态规划数组来计算有多少种不同的方法可以使数组中的元素加减组合得到目标值 target。下面是对代码的详细解释:

题目描述

给定一个整数数组 nums 和一个整数 target,求在数组中添加 +- 符号,使得计算结果等于 target 的方法数。

解决思路

通过将问题转换为背包问题,找到一种加减运算,使得数组中的元素的和等于目标值 target。具体来说,将数组划分为两个子集,使得一个子集的和减去另一个子集的和等于目标值 target。这可以通过以下关系来实现:

[ P - N = \text{target} ]
[ P + N = \text{sum} ]

通过这两个方程可以得到:

[ 2P = \text{target} + \text{sum} ]

因此,问题转换为在数组中找到一个子集 P,使得 P 的和等于 (target + sum) / 2

代码解释

  1. 计算数组总和 sum

    int sum = 0;
    for (int i = 0; i < nums.length; i++) {sum += nums[i];
    }
    
  2. 特殊情况处理

    if (sum < Math.abs(target)) {return 0;
    }
    if ((sum + target) % 2 != 0) {return 0;
    }
    
    • 如果 target 的绝对值大于 sum,那么无法通过加减运算得到 target
    • 如果 (sum + target) 不是偶数,也无法找到一个整数子集和使得 P 等于 (target + sum) / 2
  3. 计算 left

    int left = (sum + target) / 2;
    
  4. 初始化动态规划数组 dp

    int[][] dp = new int[nums.length][left + 1];
    if (nums[0] <= left) {dp[0][nums[0]] = 1;
    }
    

    dp[i][j] 表示遍历到数组第 i 个数时,和为 j 的方法总数。

  5. 初始化最左列 dp[i][0]

    int numZeros = 0;
    for (int i = 0; i < nums.length; i++) {if (nums[i] == 0) {numZeros++;}dp[i][0] = (int) Math.pow(2, numZeros);
    }
    
    • 初始化最左列,当和为 0 时,如果数组中有 n0,则有 2^n 种方案,因为每个 0 可以取 +-
  6. 填充动态规划数组 dp

    for (int i = 1; i < nums.length; i++) {for (int j = 1; j <= left; j++) {if (nums[i] > j) {dp[i][j] = dp[i - 1][j];} else {dp[i][j] = dp[i - 1][j] + dp[i - 1][j - nums[i]];}}
    }
    
    • 遍历每个数字 nums[i] 和每个可能的背包容量 j
    • 如果 nums[i] > j,则当前数字不能放入背包,方案数为 dp[i - 1][j]
    • 否则,方案数为 dp[i - 1][j] + dp[i - 1][j - nums[i]],即不放入当前数字的方案数加上放入当前数字的方案数。
  7. 返回结果

    return dp[nums.length - 1][left];
    

    返回和为 left 的方法数,即满足条件的方案数。

总结

这段代码通过将问题转换为背包问题,使用二维动态规划数组来求解目标和问题。通过初始化和填充动态规划数组,最终得到了满足条件的方案数。

474. 一和零

给你一个二进制字符串数组 strs 和两个整数 m 和 n 。

请你找出并返回 strs 的最大子集的长度,该子集中 最多 有 m 个 0 和 n 个 1 。

如果 x 的所有元素也是 y 的元素,集合 x 是集合 y 的 子集 。

示例 1:

输入:strs = [“10”, “0001”, “111001”, “1”, “0”], m = 5, n = 3
输出:4
解释:最多有 5 个 0 和 3 个 1 的最大子集是 {“10”,“0001”,“1”,“0”} ,因此答案是 4 。
其他满足题意但较小的子集包括 {“0001”,“1”} 和 {“10”,“1”,“0”} 。{“111001”} 不满足题意,因为它含 4 个 1 ,大于 n 的值 3 。
示例 2:

输入:strs = [“10”, “0”, “1”], m = 1, n = 1
输出:2
解释:最大的子集是 {“0”, “1”} ,所以答案是 2 。
在这里插入图片描述

class Solution {public int findMaxForm(String[] strs, int m, int n) {//dp[i][j]表示i个0和j个1时的最大子集int[][] dp = new int[m + 1][n + 1];int oneNum, zeroNum;for (String str : strs) {oneNum = 0;zeroNum = 0;for (char ch : str.toCharArray()) {if (ch == '0') {zeroNum++;} else {oneNum++;}}//倒序遍历for (int i = m; i >= zeroNum; i--) {for (int j = n; j >= oneNum; j--) {dp[i][j] = Math.max(dp[i][j], dp[i - zeroNum][j - oneNum] + 1);}}}return dp[m][n];}
}

这段代码实现了一个解决“01背包”问题的算法,具体是关于求最大子集的问题。题目要求给定一个包含仅由 '0''1' 组成的字符串数组 strs,以及两个整数 mn,要求找出数组中的最大子集,该子集中的 '0' 的数量不超过 m,且 '1' 的数量不超过 n

解决思路

这是一个典型的二维“01背包”问题。每个字符串可以看作是一个物品,字符串中 '0' 的数量和 '1' 的数量分别对应物品的重量。目标是选择尽可能多的字符串,使得总的 '0''1' 的数量不超过 mn

代码解释

  1. 初始化动态规划数组 dp

    int[][] dp = new int[m + 1][n + 1];
    

    dp[i][j] 表示在最多有 i'0'j'1' 的情况下,可以组成的最大子集的大小。

  2. 遍历每个字符串 str

    int oneNum, zeroNum;
    for (String str : strs) {oneNum = 0;zeroNum = 0;for (char ch : str.toCharArray()) {if (ch == '0') {zeroNum++;} else {oneNum++;}}
    
    • 统计字符串中 '0''1' 的数量。
    • oneNum 表示字符串中 '1' 的数量。
    • zeroNum 表示字符串中 '0' 的数量。
  3. 更新动态规划数组 dp

    for (int i = m; i >= zeroNum; i--) {for (int j = n; j >= oneNum; j--) {dp[i][j] = Math.max(dp[i][j], dp[i - zeroNum][j - oneNum] + 1);}
    }
    
    • 通过倒序遍历来确保每个字符串只被计算一次。
    • 对于每个 dp[i][j],考虑当前字符串是否放入背包:
      • 如果不放入,dp[i][j] 保持不变。
      • 如果放入,新的状态是 dp[i - zeroNum][j - oneNum] + 1
      • 取两者的最大值更新 dp[i][j]
  4. 返回结果

    return dp[m][n];
    

    最后,dp[m][n] 即为最多有 m'0'n'1' 的情况下,可以组成的最大子集的大小。

总结

这段代码通过动态规划解决了“01背包”问题。使用二维数组 dp 来存储在不同的 '0''1' 限制下可以组成的最大子集的大小。通过遍历每个字符串,计算其 '0''1' 的数量,并更新 dp 数组,最终得到满足条件的最大子集大小。

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

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

相关文章

【软件测试】白盒测试与接口测试详解

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、什么是白盒测试 白盒测试是一种测试策略&#xff0c;这种策略允许我们检查程序的内部结构&a…

5.9k!一款清新好用的后台管理系统!【送源码】

今天给大家分享的开源项目是一个优雅清新后台管理系统——Soybean Admin。 简介 官方是这样介绍这个项目的&#xff1a; Soybean Admin 使用的是Vue3作为前端框架&#xff0c;TypeScript作为开发语言&#xff0c;同时还整合了NaiveUI组件库&#xff0c;使得系统具有高可用性和…

Vue3.3 的 defineOptions 的使用,方便在 setup 语法糖中为组件命名和控制父子属性透传,包含在线运行实例欧

defineOptions 是 Vue3.3 的新的宏&#xff0c;可以通过 defineOptions 宏在 <script setup> 中使用选项式 API&#xff0c;也就是说可以在一个宏函数中设置 name, props, emits, render, 控制是否允许父子非 props 的属性透传等功能。 defineOptions 可以直接在 setup …

[数据集][目标检测]花生米计数霉变检测数据集VOC+YOLO格式387张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;387 标注数量(xml文件个数)&#xff1a;387 标注数量(txt文件个数)&#xff1a;387 标注类别…

pycharm terminal终端不能激活 conda 虚拟环境,解决方法

# 1. 确保执行策略已更改 Set-ExecutionPolicy RemoteSigned -Scope CurrentUser# 2. 初始化Conda conda init powershell# 3. 重启PowerShell# 4. 验证Conda初始化 conda --version# 5. 激活Conda环境 conda activate shi_labelme关闭所有的终端&#xff0c;然后重新打开新的终…

【图像分类】Yolov8 完整教程 |分类 |计算机视觉

目标&#xff1a;用YOLOV8进行图像分类。 图像分类器。 学习资源&#xff1a;https://www.youtube.com/watch?vZ-65nqxUdl4 努力的小巴掌 记录计算机视觉学习道路上的所思所得。 1、文件结构化 划分数据集&#xff1a;train,val,test 知道怎么划分数据集很重要。 文件夹…

Linux系统相关函数总结

在应用程序当中&#xff0c;有时往往需要去获取到一些系统相关的信息&#xff0c;譬如时间、日期、以及其它一些系统相关信息&#xff0c;本章将向大家介绍如何通过 Linux 系统调用或 C 库函数获取这些系统信息。除此之外&#xff0c;还会向大家介绍 Linux 系统下的/proc 虚拟文…

Day.js

Day.js 是什么&#xff1f; Day.js是一个极简的JavaScript库&#xff0c;可以为现代浏览器解析、验证、操作和显示日期和时间。 Day.js中文网 为什么要使用Day.js &#xff1f; 因为Day.js文件只有2KB左右&#xff0c;下载、解析和执行的JavaScript更少&#xff0c;为代码留下更…

高考志愿不知道怎么填?教你1招,用这款AI工具,立省4位数

高中的岁月&#xff0c;就像一本厚厚的书&#xff0c;我们一页页翻过&#xff0c;现在&#xff0c;终于翻到了最后一页。但这不是结束&#xff0c;这是新的开始&#xff0c;是人生的新篇章。 高考落幕&#xff0c;学子们在短暂的放松后&#xff0c;又迎来了紧张的志愿填报。 “…

【机器学习300问】134、什么是主成分分析(PCA)?

假设你的房间堆满了各种各样的物品&#xff0c;书籍、衣服、玩具等等&#xff0c;它们杂乱无章地散落各处。现在&#xff0c;你想要清理房间&#xff0c;但又不想扔掉任何东西&#xff0c;只是希望让房间看起来更整洁&#xff0c;更容易管理。 你开始思考&#xff0c;能否将物品…

苹果笔记本双系统怎么安装

想要在mac电脑上装双系统&#xff0c;首先需要确认您的电脑是否支持。苹果电脑自带的boot camp工具可以帮助您在mac上安装windows系统&#xff0c;只需按照步骤进行操作即可。另外&#xff0c;您也可以使用虚拟机软件&#xff0c;如parallels desktop或vmware fusion&#xff0…

地铁中的CAN通信--地铁高效安全运转原理

目前地铁采用了自动化的技术来实现控制,有ATC(列车自动控制)系统可以实现列车自动驾驶、自动跟踪、自动调度;SCADA(供电系统管理自动化)系统可以实现主变电所、牵引变电所、降压变电所设备系统的遥控、遥信、遥测;BAS(环境监控系统)和FAS(火灾报警系统)可以实现车站…

mmdetection2.28修改backbone不使用预训练参数、从头训练

背景 最近需要测试一下在backbone部分如果不使用预训练参数的话&#xff0c;模型需要多少轮才能收敛所使用的backbone是mmcls.ConvNeXtmmdetection版本为2.28.2&#xff0c;mmcls版本为0.25.0 修改流程 最简单的方法&#xff0c;直接去mmcls的model zoo里找到对应backbone的…

NAND闪存巨头铠侠(Kioxia)计划最迟于10月下旬通过首次公开募股IPO

据路透社于6月26日引用消息来源的报道&#xff0c;在半导体市场条件反弹及财务业绩迅速改善的背景下&#xff0c;NAND闪存巨头铠侠&#xff08;Kioxia&#xff09;正准备尽快提交初步申请&#xff0c;并计划最迟于10月下旬通过首次公开募股&#xff08;IPO&#xff09;在东京证…

可转债交易的规则,权限开通条件。可转债的佣金最低标准万0.44!

可转债交易规则 【1】可转债最小交易单位为1手&#xff0c;1手10张&#xff0c;每张的价格就是大家看到的价格。这和股票很不一样&#xff0c;股票的1手是100股股票。可转债最小价格变动单位为0.001 【2】可转债是T0交易&#xff0c;即当天买入&#xff0c;当天就可以卖出。这…

全新版的 FinClip 也太好用了吧

自 2017 年 FinClip 小程序管理平台发布直至 2023 年已经走过了 6 年。在这一路中我们惊喜的看到 FinClip 在各行业的客户支持下开枝散叶&#xff0c;逐渐承载了不同行业客户对于「数字场景拓展与增长」的期待。 在早期版本的 FinClip 设计中&#xff0c;我们对产品的边界认识…

62.指针和二维数组(2)

一.指针和二维数组 1.如a是一个二维数组&#xff0c;则数组中的第i行可以看作是一个一维数组&#xff0c;这个一维数组的数组名是a[i]。 2.a[i]代表二维数组中第i行的首个元素的地址&#xff0c;即a[i][0]的地址。 二.进一步思考 二维数组可以看作是数组的数组&#xff0c;本…

线性相关,无关?秩?唯一解(只有零解),无穷解(有非零解)?D=0,D≠0?

目录 线性有关无关 和 唯一解&#xff08;只有零解&#xff09;&#xff0c;无穷解&#xff08;有非零解&#xff09;之间的关系 D0&#xff0c;D≠0&#xff1f; 和 秩 的关系 串起来&#xff1a; 线性相关&#xff0c;无关&#xff1f;秩&#xff1f;唯一解&#xff08;只…

golang 实现继承方式

经常使用java或c同学应该比较了解纯面向对象&#xff0c;继承、接口、封装等特性&#xff0c;在go中并没有特别显示的表达出来&#xff0c;但是go隐含是支持的&#xff0c;只是支持的方式不一致&#xff0c;可以说go的方式更加灵活&#xff0c;go语言精髓是组合机制&#xff0c…

VMware 最新的安全漏洞公告VMSA-2024-0013

#深度好文计划# 一、摘要 2024年6月26日&#xff0c;VMware 发布了最新的安全漏洞公告 VMSA-2024-0013&#xff0c;修复了 VMware ESXi 和 VMware vCenter 中的多个安全漏洞。 VMSA-2024-0013&#xff1a;VMware ESXi 和 vCenter Server 更新修正了多个安全性漏洞 &#xff…