算法刷题记录——LeetCode篇(1.8) [第71~80题](持续更新)
更新时间:2025-04-10
- 算法题解目录汇总:算法刷题记录——题解目录汇总
- 技术博客总目录:计算机技术系列博客——目录页
优先整理热门100及面试150,不定期持续更新,欢迎关注!
72. 编辑距离
给你两个单词 word1
和 word2
, 请返回将 word1
转换成 word2
所使用的最少操作数。
你可以对一个单词进行如下三种操作:
- 插入一个字符
- 删除一个字符
- 替换一个字符
示例 1:
输入:word1 = "horse", word2 = "ros"
输出:3
解释:
horse -> rorse (将 ‘h’ 替换为 ‘r’)
rorse -> rose (删除 ‘r’)
rose -> ros (删除 ‘e’)
示例 2:
输入:word1 = "intention", word2 = "execution"
输出:5
解释:
intention -> inention (删除 ‘t’)
inention -> enention (将 ‘i’ 替换为 ‘e’)
enention -> exention (将 ‘n’ 替换为 ‘x’)
exention -> exection (将 ‘n’ 替换为 ‘c’)
exection -> execution (插入 ‘u’)
提示:
0 <= word1.length, word2.length <= 500
word1 和 word2 由小写英文字母组成
方法一:标准动态规划
使用二维数组 dp[i][j]
表示将 word1
的前 i
个字符转换为 word2
的前 j
个字符所需的最小操作数。通过状态转移方程处理插入、删除、替换三种操作。
- 若
word1[i-1] == word2[j-1]
:dp[i][j] = dp[i-1][j-1]
- 否则:
dp[i][j] = min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]) + 1
代码实现(Java):
class Solution {public int minDistance(String word1, String word2) {int m = word1.length(), n = word2.length();int[][] dp = new int[m+1][n+1];// 初始化边界条件for (int i = 0; i <= m; i++) dp[i][0] = i;for (int j = 0; j <= n; j++) dp[0][j] = j;// 填充dp表for (int i = 1; i <= m; i++) {for (int j = 1; j <= n; j++) {if (word1.charAt(i-1) == word2.charAt(j-1)) {dp[i][j] = dp[i-1][j-1];} else {dp[i][j] = Math.min(Math.min(dp[i-1][j], dp[i][j-1]),dp[i-1][j-1]) + 1;}}}return dp[m][n];}
}
复杂度分析:
- 时间复杂度:
O(m×n)
,双重循环遍历所有字符组合。 - 空间复杂度:
O(m×n)
,存储二维动态规划表。
方法二:空间优化动态规划
通过滚动数组将二维空间压缩为一维数组,利用临时变量保存左上角的值(对应二维数组的 dp[i-1][j-1]
)。
代码实现(Java):
class Solution {public int minDistance(String word1, String word2) {int m = word1.length(), n = word2.length();if (m < n) {return minDistance(word2, word1); // 确保word2较短以优化空间}int[] dp = new int[n+1];// 初始化第一行(word1为空时的操作数)for (int j = 0; j <= n; j++) dp[j] = j;// 逐行更新for (int i = 1; i <= m; i++) {int prev = dp[0]; // 保存左上角的值(对应dp[i-1][j-1])dp[0] = i; // 当前行的第一个元素(word2为空时的操作数)for (int j = 1; j <= n; j++) {int temp = dp[j]; // 保存旧值,作为下一轮的左上角值if (word1.charAt(i-1) == word2.charAt(j-1)) {dp[j] = prev;} else {dp[j] = Math.min(Math.min(dp[j], dp[j-1]),prev) + 1;}prev = temp; // 更新左上角的值}}return dp[n];}
}
复杂度分析:
- 时间复杂度:
O(m×n)
,与标准动态规划相同。 - 空间复杂度:
O(n)
,仅维护一维数组。
方法三:递归 + 记忆化
递归计算每个子问题的解,并通过记忆化缓存避免重复计算。适用于小规模输入或理解问题本质,但不推荐用于大规模数据。
代码实现(Java):
class Solution {private Integer[][] memo;private String word1, word2;public int minDistance(String word1, String word2) {this.word1 = word1;this.word2 = word2;memo = new Integer[word1.length()][word2.length()];return dfs(word1.length()-1, word2.length()-1);}private int dfs(int i, int j) {if (i < 0) return j+1; // word1已空,需插入j+1个字符if (j < 0) return i+1; // word2已空,需删除i+1个字符if (memo[i][j] != null) return memo[i][j];if (word1.charAt(i) == word2.charAt(j)) {memo[i][j] = dfs(i-1, j-1);} else {int insert = dfs(i, j-1) + 1;int delete = dfs(i-1, j) + 1;int replace = dfs(i-1, j-1) + 1;memo[i][j] = Math.min(Math.min(insert, delete), replace);}return memo[i][j];}
}
复杂度分析:
- 时间复杂度:
O(m×n)
,但递归调用栈可能带来额外开销。 - 空间复杂度:
O(m×n)
,用于存储记忆化表。
74. 搜索二维矩阵
给你一个满足下述两条属性的 m x n
整数矩阵:
- 每行中的整数从左到右按非严格递增顺序排列。
- 每行的第一个整数大于前一行的最后一个整数。
给你一个整数 target
,如果 target
在矩阵中,返回 true
;否则,返回 false
。
示例 1:
输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
输出:true
示例 2:
输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13
输出:false
提示:
m == matrix.length
n == matrix[i].length
1 <= m, n <= 100
-10^4 <= matrix[i][j], target <= 10^4
方法一:二维转一维的二分查找
将二维矩阵视为连续的一维有序数组,通过数学计算将一维索引转换为二维坐标,进行标准二分查找。
代码实现(Java):
class Solution {public boolean searchMatrix(int[][] matrix, int target) {int m = matrix.length, n = matrix[0].length;int left = 0, right = m * n - 1;while (left <= right) {int mid = left + (right - left) / 2;// 计算对应的二维坐标int row = mid / n;int col = mid % n;int val = matrix[row][col];if (val == target) {return true;} else if (val < target) {left = mid + 1;} else {right = mid - 1;}}return false;}
}
复杂度分析:
- 时间复杂度:
O(log(mn))
, - 空间复杂度:
O(1)
。
方法二:两次二分查找
先通过二分确定目标所在行,再在该行中进行二分查找。
代码实现(Java):
class Solution {public boolean searchMatrix(int[][] matrix, int target) {int m = matrix.length, n = matrix[0].length;// 查找目标所在行int low = 0, high = m - 1;while (low <= high) {int mid = (low + high) / 2;if (matrix[mid][0] > target) {high = mid - 1;} else {low = mid + 1;}}// high是可能所在行if (high < 0) return false;int row = high;// 检查该行范围if (matrix[row][n - 1] < target) return false;// 行内二分查找int left = 0, right = n - 1;while (left <= right) {int mid = (left + right) / 2;if (matrix[row][mid] == target) {return true;} else if (matrix[row][mid] < target) {left = mid + 1;} else {right = mid - 1;}}return false;}
}
复杂度分析:
- 时间复杂度:
O(log m + log n)
, - 空间复杂度:
O(1)
。
76. 最小覆盖子串
给你一个字符串 s
、一个字符串 t
。返回 s
中涵盖 t
所有字符的最小子串。如果 s
中不存在涵盖 t
所有字符的子串,则返回空字符串 ""
。
注意:
- 对于
t
中重复字符,我们寻找的子字符串中该字符数量必须不少于t
中该字符数量。 - 如果
s
中存在这样的子串,我们保证它是唯一的答案。
示例 1:
输入:s = "ADOBECODEBANC", t = "ABC"
输出:"BANC"
解释:最小覆盖子串 “BANC” 包含来自字符串 t 的 ‘A’、‘B’ 和 ‘C’。
示例 2:
输入:s = "a", t = "a"
输出:"a"
解释:整个字符串 s 是最小覆盖子串。
示例 3:
输入: s = "a", t = "aa"
输出: ""
解释: t 中两个字符 ‘a’ 均应包含在 s 的子串中,
因此没有符合条件的子字符串,返回空字符串。
提示:
m == s.length
n == t.length
1 <= m, n <= 10^5
s 和 t 由英文字母组成
进阶:
你能设计一个在 O(m+n)
时间内解决此问题的算法吗?
方法一:滑动窗口 + 双指针(最优解法)
- 使用滑动窗口维护一个可变区间,通过移动左右指针动态调整窗口大小。
- 利用数组统计目标字符出现次数,并通过计数器
valid
判断当前窗口是否满足条件。 - 当窗口满足条件时收缩左边界,寻找最小覆盖子串。
代码实现(Java):
public class Solution {public String minWindow(String s, String t) {int[] need = new int[128]; // 存储t中各字符的需求量int count = 0; // 记录t中不同字符的数量for (char c : t.toCharArray()) {if (need[c] == 0) count++;need[c]++;}int[] window = new int[128];// 当前窗口各字符的出现次数int left = 0, right = 0; // 滑动窗口的左右指针int valid = 0; // 满足条件的字符数量int start = 0; // 最小窗口的起始位置int minLen = Integer.MAX_VALUE; // 最小窗口长度while (right < s.length()) {char c = s.charAt(right);right++;// 若当前字符是目标字符,更新窗口统计if (need[c] > 0) {window[c]++;// 当该字符数量刚好满足需求时,valid加1if (window[c] == need[c]) {valid++;}}// 当前窗口满足条件时,尝试收缩左边界while (valid == count) {// 更新最小窗口信息if (right - left < minLen) {start = left;minLen = right - left;}char d = s.charAt(left);left++;// 若移除的是目标字符,更新窗口统计if (need[d] > 0) {if (window[d] == need[d]) {valid--; // 该字符不再满足需求,valid减1}window[d]--;}}}return minLen == Integer.MAX_VALUE ? "" : s.substring(start, start + minLen);}
}
复杂度分析:
- 时间复杂度:
O(m + n)
,其中m
和n
分别为s
和t
的长度。每个字符最多被左右指针各访问一次。 - 空间复杂度:
O(1)
,固定长度的数组(ASCII 字符集)。
方法二:优化哈希表版本
与滑动窗口思路一致,但使用哈希表(HashMap
)替代数组统计字符频率。虽然逻辑更通用,但性能略低于数组实现。
代码实现(Java):
public class Solution {public String minWindow(String s, String t) {Map<Character, Integer> need = new HashMap<>();for (char c : t.toCharArray()) {need.put(c, need.getOrDefault(c, 0) + 1);}Map<Character, Integer> window = new HashMap<>();int left = 0, right = 0, valid = 0;int start = 0, minLen = Integer.MAX_VALUE;while (right < s.length()) {char c = s.charAt(right);right++;if (need.containsKey(c)) {window.put(c, window.getOrDefault(c, 0) + 1);if (window.get(c).equals(need.get(c))) {valid++;}}while (valid == need.size()) {if (right - left < minLen) {start = left;minLen = right - left;}char d = s.charAt(left);left++;if (need.containsKey(d)) {if (window.get(d).equals(need.get(d))) {valid--;}window.put(d, window.get(d) - 1);}}}return minLen == Integer.MAX_VALUE ? "" : s.substring(start, start + minLen);}
}
复杂度分析:
- 时间复杂度:
O(m + n)
,哈希表操作的时间复杂度为均摊O(1)
。 - 空间复杂度:
O(k)
,k
为t
中不同字符的数量。
方法三:暴力枚举
枚举所有可能的子串,检查是否覆盖 t 的所有字符。该方法时间复杂度为 O(m²)
,无法通过大规模数据测试,但有助于理解问题本质。
代码实现(Java):
public class Solution {public String minWindow(String s, String t) {int minLen = Integer.MAX_VALUE;String result = "";for (int i = 0; i < s.length(); i++) {for (int j = i + t.length(); j <= s.length(); j++) {String sub = s.substring(i, j);if (isCover(sub, t)) {if (j - i < minLen) {minLen = j - i;result = sub;}}}}return result;}private boolean isCover(String sub, String t) {int[] count = new int[128];for (char c : sub.toCharArray()) count[c]++;for (char c : t.toCharArray()) {count[c]--;if (count[c] < 0) return false;}return true;}
}
复杂度分析:
- 时间复杂度:
O(m² × n)
,其中m
为s
的长度,n
为t
的长度。 - 空间复杂度:
O(1)
,统计字符频率的数组长度固定。
78. 子集
给你一个整数数组 nums
,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。
示例 1:
输入:nums = [1,2,3]
输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
示例 2:
输入:nums = [0]
输出:[[],[0]]
提示:
1 <= nums.length <= 10
-10 <= nums[i] <= 10
nums 中的所有元素互不相同
方法一:回溯法
通过递归生成所有子集,每次递归选择一个元素加入路径,并确保后续元素不重复选择。
代码实现(Java):
public class Solution {public List<List<Integer>> subsets(int[] nums) {List<List<Integer>> res = new ArrayList<>();backtrack(res, new ArrayList<>(), nums, 0);return res;}private void backtrack(List<List<Integer>> res, List<Integer> path, int[] nums, int start) {res.add(new ArrayList<>(path)); // 添加当前路径到结果for (int i = start; i < nums.length; i++) {path.add(nums[i]); // 选择当前元素backtrack(res, path, nums, i + 1); // 递归处理后续元素path.remove(path.size() - 1); // 撤销选择(回溯)}}
}
复杂度分析:
- 时间复杂度:
O(n * 2^n)
,每个子集生成需要O(n)
时间,总共有2^n
个子集。 - 空间复杂度:
O(n)
,递归栈深度最大为n
,结果空间额外占用O(n * 2^n)
。
方法二:迭代法
逐步扩展子集,每次将新元素添加到所有现有子集中,生成新子集。
代码实现(Java):
public class Solution {public List<List<Integer>> subsets(int[] nums) {List<List<Integer>> res = new ArrayList<>();res.add(new ArrayList<>()); // 初始空集for (int num : nums) {List<List<Integer>> newSubsets = new ArrayList<>();for (List<Integer> subset : res) {List<Integer> newSubset = new ArrayList<>(subset);newSubset.add(num); // 生成新子集newSubsets.add(newSubset);}res.addAll(newSubsets); // 合并新子集}return res;}
}
复杂度分析:
- 时间复杂度:
O(n * 2^n)
,每次迭代处理2^i
个子集,总操作次数为2^(n+1) - 1
。 - 空间复杂度:
O(n * 2^n)
,存储所有子集。
方法三:位运算法
利用二进制掩码表示元素是否被选中,遍历所有可能的掩码生成子集。
代码实现(Java):
public class Solution {public List<List<Integer>> subsets(int[] nums) {List<List<Integer>> res = new ArrayList<>();int n = nums.length;int total = 1 << n; // 计算 2^nfor (int mask = 0; mask < total; mask++) {List<Integer> subset = new ArrayList<>();for (int i = 0; i < n; i++) {if ((mask & (1 << i)) != 0) { // 检查第i位是否为1subset.add(nums[i]);}}res.add(subset);}return res;}
}
复杂度分析:
- 时间复杂度:
O(n * 2^n)
,遍历所有掩码并检查每一位。 - 空间复杂度:
O(n * 2^n)
,存储所有子集。
79. 单词搜索
给定一个 m x n
二维字符网格 board 和一个字符串单词 word
。如果 word
存在于网格中,返回 true
;否则,返回 false
。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例 1:
输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"
输出:true
示例 2:
输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "SEE"
输出:true
示例 3:
输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCB"
输出:false
提示:
m == board.length
n = board[i].length
1 <= m, n <= 6
1 <= word.length <= 15
board 和 word 仅由大小写英文字母组成
进阶:
你可以使用搜索剪枝的技术来优化解决方案,使其在 board
更大的情况下可以更快解决问题?
方法:回溯法(DFS + 剪枝优化)
通过深度优先搜索遍历所有可能的路径,利用回溯和剪枝策略减少无效搜索。预处理阶段检查字符数量是否足够,大幅提升效率。
代码实现(Java):
class Solution {public boolean exist(char[][] board, String word) {// 预处理:检查字符数量是否足够Map<Character, Integer> boardCount = new HashMap<>();for (char[] row : board) {for (char c : row) {boardCount.put(c, boardCount.getOrDefault(c, 0) + 1);}}Map<Character, Integer> wordCount = new HashMap<>();for (char c : word.toCharArray()) {wordCount.put(c, wordCount.getOrDefault(c, 0) + 1);}for (char c : wordCount.keySet()) {if (boardCount.getOrDefault(c, 0) < wordCount.get(c)) {return false;}}// 回溯搜索for (int i = 0; i < board.length; i++) {for (int j = 0; j < board[0].length; j++) {if (board[i][j] == word.charAt(0) && dfs(board, i, j, word, 0)) {return true;}}}return false;}private boolean dfs(char[][] board, int i, int j, String word, int index) {if (index == word.length() - 1) return true;char tmp = board[i][j];board[i][j] = '#'; // 标记为已访问int[][] dirs = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};for (int[] dir : dirs) {int x = i + dir[0], y = j + dir[1];if (x < 0 || x >= board.length || y < 0 || y >= board[0].length) continue;if (board[x][y] != word.charAt(index + 1)) continue;if (dfs(board, x, y, word, index + 1)) {board[i][j] = tmp; // 提前回溯不影响结果return true;}}board[i][j] = tmp; // 回溯,恢复原字符return false;}
}
复杂度分析:
- 时间复杂度: 最坏情况
O(M*N*4^L)
,其中M
、N
为网格尺寸,L
为单词长度。预处理优化后实际运行效率显著提升。 - 空间复杂度:
O(L)
递归栈深度与单词长度相关。
80. 删除有序数组中的重复项 II
给你一个有序数组 nums
,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1)
额外空间的条件下完成。
说明:
为什么返回数值是整数,但输出的答案是数组呢?
请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。
你可以想象内部操作如下:
// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝
int len = removeDuplicates(nums);// 在函数里修改输入数组对于调用者是可见的。
// 根据你的函数返回的长度, 它会打印出数组中 该长度范围内 的所有元素。
for (int i = 0; i < len; i++) {print(nums[i]);
}
示例 1:
输入:nums = [1,1,1,2,2,3]
输出:5, nums = [1,1,2,2,3]
解释:函数应返回新长度 length = 5, 并且原数组的前五个元素被修改为 1, 1, 2, 2, 3。 不需要考虑数组中超出新长度后面的元素。
示例 2:
输入:nums = [0,0,1,1,1,1,2,3,3]
输出:7, nums = [0,0,1,1,2,3,3]
解释:函数应返回新长度 length = 7, 并且原数组的前七个元素被修改为 0, 0, 1, 1, 2, 3, 3。不需要考虑数组中超出新长度后面的元素。
提示:
1 <= nums.length <= 3 * 10^4
-10^4 <= nums[i] <= 10^4
nums 已按升序排列
方法:双指针
通过比较当前元素与写入位置的前两个元素来判断是否需要保留当前元素。
- 边界处理:如果数组长度小于等于 2,直接返回原长度,因为所有元素都满足条件。
- 初始化指针:
index
表示当前可写入的位置,初始化为 2(因为前两个元素无需检查)。 - 遍历数组:从第三个元素开始遍历:
- 如果当前元素
nums[i]
与index - 2
位置的元素不同,说明当前元素可以保留。 - 将
nums[i]
写入index
位置,并移动index
指针。
- 如果当前元素
- 返回结果:最终
index
即为新数组的长度。
代码实现(Java):
class Solution {public int removeDuplicates(int[] nums) {if (nums.length <= 2) {return nums.length;}int index = 2;for (int i = 2; i < nums.length; i++) {if (nums[i] != nums[index - 2]) {nums[index] = nums[i];index++;}}return index;}
}
复杂度分析:
- 时间复杂度:
O(n)
; - 空间复杂度:
O(1)
。
声明
- 本文版权归
CSDN
用户Allen Wurlitzer
所有,遵循CC-BY-SA
协议发布,转载请注明出处。- 本文题目来源
力扣-LeetCode
,著作权归领扣网络
所有。商业转载请联系官方授权,非商业转载请注明出处。
相关文章:
算法刷题记录——LeetCode篇(1.8) [第71~80题](持续更新)
更新时间:2025-04-10 算法题解目录汇总:算法刷题记录——题解目录汇总技术博客总目录:计算机技术系列博客——目录页 优先整理热门100及面试150,不定期持续更新,欢迎关注! 72. 编辑距离 给你两个单词 wo…...
leetcode68.左右文本对齐
思路源自 leetcode-字符串篇 68题 文本左右对齐 难度高的模拟类型题目,关键点在于事先知道有多少单词要放在本行并且还要知道本行是不是最后一行(最后一行需要全部单空格右对齐,不是最后一行就空格均摊),非最后一行的空…...
leetcode:905. 按奇偶排序数组(python3解法)
难度:简单 给你一个整数数组 nums,将 nums 中的的所有偶数元素移动到数组的前面,后跟所有奇数元素。 返回满足此条件的 任一数组 作为答案。 示例 1: 输入:nums [3,1,2,4] 输出:[2,4,3,1] 解释:…...
Java抽象类与抽象方法详解
一、抽象类的作用与定义 1. 核心作用 设计意图:当多个子类具有共性行为但具体实现不同时,通过抽象类强制规范子类的实现格式。 典型场景: // 定义抽象图形类 public abstract class Shape {// 抽象方法:计算面…...
QScrCpy源码解析(3)监听手机usb端口
采用的技术方式为adb adb可以通过命令行达到控制安卓手机的目的 大致思路为 1在界面显示的时候初始化一个定时器,不断地查询当前设备连接到的手机安卓设备 使用的adb指令为 adb devices 定时器代码 connect(&m_autoUpdatetimer, &QTimer::timeout, th…...
go-zero学习笔记(六)---gozero中间件介绍
1. 中间件分类 gozero默认中间件通过在api文件中创建的中间件通过server.Use(middleware Middleware)创建的中间件2. 中间件介绍 2.1 gozero默认中间件 默认中间件包括如下:在gozero中对应的代码为: // 文件位置:github.com\zeromicro\g…...
基于FPGA实现BPSK 调制
目录 一、 任务介绍二、基本原理三、基于FPGA实现BPSK 调制四、源码 一、 任务介绍 BPSK 调制在数字通信系统中是一种极重要的调制方式,它的抗干扰噪声性能及通频带的利用率均优先于 ASK 移幅键控和 FSK 移频键控。因此,PSK 技术在中、高速数据传输中得…...
包含网络、平台、数据及安全四大体系的智慧快消开源了
智慧快消视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。国产化人工智能“…...
基于AWS的大模型调用场景:10大成本优化实战方案
大模型训练与推理是AI领域的计算密集型场景,如何在AWS上实现高性能与低成本的双重目标?本文从实例选型、弹性伸缩、存储优化等角度,分享10个经过验证的AWS成本优化策略,帮助企业节省30%以上成本。 一、大模型场景的成本痛点分析 计…...
Human3.6M 解析3d pose标注 h36m
目录 解析pkl 并可视化 解析h5格式: view_h36m_h5_ok.py nlf 预测并计算指标mpje 解析pkl 并可视化 import os import pickleimport cv2 import imageio import numpy as npif __name__ == __main__:# pkl_path=r"E:\data\pose_3d\human3.6mtoolbox\annot\h36m_valid…...
设计模式-观察者模式和发布订阅模式区别
文章目录 其他不错的文章 二者有类似的地方,也有区别。 引用的文章说的已经比较清楚了,这里只列出对比图。 对比点观察者模式发布订阅模式中间人角色无事件中心,观察者直接订阅目标有事件中心,发布者与订阅者通过事件中心通信关系…...
Python proteinflow 库介绍
ProteinFlow是一个开源的Python库,旨在简化蛋白质结构数据在深度学习应用中的预处理过程。以下是其详细介绍: 功能 数据处理:支持处理单链和多链蛋白质结构,包括二级结构特征、扭转角等特征化选项。 数据获取:能够从Protein Data Bank (PDB)和Structural Antibody Databa…...
羽绒服选购
羽绒服怎么选? 看吊牌 填充物含绒子量充绒克数 填充物: 鹅绒>鸭绒>鹅鸭混合绒 中国90%羽绒服都是鸭绒,鹅绒产量少,且拔毛方式不人道,所以价格更高 白鸭绒和黑鸭绒区别不大,但是白羽绒服只能用白鸭绒…...
使用注解@RequestBody变红的解决问题
解决办法: package com.takeout.controller;import com.takeout.common.R; import com.takeout.entity.Employee; import com.takeout.service.EmployeeService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowire…...
Multi-Agent Routing Value Iteration Network(多智能体路由值迭代网络)论文阅读
标题:Multi-Agent Routing Value Iteration Network(多智能体路由值迭代网络) 作者:Quinlan Sykora, Mengye Ren, Raquel Urtasun 单位: Uber 发表期刊:AI 发表时间:2020年 论文研究主题归类…...
商品详情 API 返回数据字段说明
京东商品详情 API 返回的数据是一个结构化的 JSON 对象,包含了商品的多个关键字段。以下是一些常见的返回值字段及其说明: 1. 商品基本信息 num_iid:商品唯一标识符。 title:商品标题。 desc_short:商品简短描述。 …...
数据结构 | 证明链表环结构是否存在
❤个人主页: 链表环结构 0.前言1.环形链表(基础)2.环形链表Ⅱ(中等)3.证明相遇条件及结论3.1 问题1特殊情况证明3.2 问题1普适性证明 0.前言 在这篇博客中,我们将深入探讨链表环结构的检测方法:…...
AI Agent类开发应避免Python独舞,奏响多技术交响曲
、 (前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站)。 一、Python的局限:从“万能”到“单薄”的技术困境 1.1 Python的统治地位与暗礁 Python在AI…...
git基本使用
git 默认情况下,克隆的远程仓库会被命名为 origin git remote remove origin # 移除默认的远程仓库 origingit remote add origin https://github.com/CS144/minnow.git # 添加一个新的远程仓库 origin,指向自己的 GitHub 仓库git branch -M main #将当…...
解决IDEA中自动生成返回值带final修饰的问题
修改配置文件: 1、在settings选项下,Editor–Code Style–Java–Code Generation,确保红框内的两项不被勾选 2、在自动生成的地方,仔细观看final下面带有下划线,说明此处存在快捷键,这时按下ALT F, 选项框会取消勾选Declare final. 回车接…...
Java中的Exception和Error有什么区别?还有更多扩展
概念 在Java中,Exception和Error都是Throwable的子类,用于处理程序中的错误和异常情况。 然而,它们在用途和处理方式上有显著的不同: Exception: 用于表示程序在正常运行过程中可能出现的错误,如文件未找…...
什么是中性线、零线、地线,三相四线制如何入户用电
在变压器三相电侧,按照星形连接法,有一个中心点,这根线引出来的线接不接地:不接地就是中性线,接地就是零线 下面就是没有接地:中性线 接地了以后就可以叫做零线了 三相电在高压输电的时候是没有零线的&a…...
不用额外下载jar包,idea快速查看使用的组件源码
以nacos为例子,在idea中引入了nacos依赖,就可以查看源码了。 2. idea选择open(不关闭项目直接选择file-open也可以), 在maven的仓库里找到对应的包,打开 2.idea中选择 jar包,选择 add as library 3.这样j…...
Ant Design X 和 Element-Plus-X
Ant Design X 是 Ant Design 的全新 AGI 组件库,旨在帮助开发者更轻松地研发 AI 产品用户界面。提供AI交互所需的Attachments、Sender、ThoughtChain等组件,以及useXAgent、XStream等hooks。 具备支持Vue和React两个版本 React: https://gi…...
jetson配置yolov5(tensor加速版)出现的问题(killed+tensor+~)
1.在cmake生成engine引擎文件时,出现一系列报错 make [ 20%] Building NVCC (Device) object CMakeFiles/myplugins.dir/myplugins_generated_yololayer.cu.o /home/lin/yolov5-4.0/yolov5/yololayer.h(54): error: member function declared with "override&…...
【华为战报】2025年3月 考试战报!
原创:厦门微思网络 了解更多往期考试→点 【考试战报】 华为认证 HCIA 3月 微思 | HCIA 考试战报 学员成绩单 华为认证 HCIP 3月 微思 | HCIP 考试战报 学员成绩单 学员证书 华为认证 HCIE 3月 微思 | HCIE 考试战报 学员成绩单 学员证书 华为认证 最新开班 厦门面授…...
daz3d ERC Freeze to Morph Target 和 另存为 Morph Asset(s)
. ERC 冻结至变形目标 (ERC Freeze to Morph Target) 核心目标:将骨架的调整与自定义造型的滑块关联起来。 详细解释: 当你创建一个自定义造型(Morph)并调整了骨架(Rigging)以适应这个新造型后ÿ…...
【网络安全 | 项目开发】Web 安全响应头扫描器(提升网站安全性)
未经许可,不得转载。 文章目录 项目简介项目功能示例输出技术栈:简单代码结构可选扩展功能项目简介 Web 安全响应头扫描器(Security Headers Checker),一个安全合规工具,用于检测目标网站是否配置了关键的 HTTP 安全头部,帮助开发者提升网站基础安全性。 项目功能 1.…...
Python - 爬虫-网页抓取数据-库requests
requests库是一个功能强大的HTTP库,用于发送各种HTTP请求,如GET、POST、PUT、DELETE等。 requests官网:Requests: HTTP for Humans™ — Requests 2.32.3 documentation 使用requests可以模拟浏览器的请求,比起之前用的urllib&a…...
antv x6使用(支持节点排序、新增节点、编辑节点、删除节点、选中节点)
项目需要实现如下效果流程图,功能包括节点排序、新增节点、编辑节点、删除节点、选中节点等 html部分如下: <template><div class"MindMapContent"><el-button size"small" click"addNode">新增节点&…...
Nginx 是什么?Nginx高并发架构拆解指南
你是一个程序员,你在电脑上编辑了一段文本,将它保存为 txt 文件。将它拖到浏览器打开,就能看到文件里的内容。 但这看起来太过单调,为了让画面更丰富,我们定个规则,在文本边上加个两个h1符号,文…...
JS forEach方法
遍历数组...
可道云支持群晖的docker安装了:全网唯一支持onlyoffice安装说明
在群晖系统上部署可道云面临显著的技术门槛。DSM7.2版本因不兼容Apache2.2等组件,用户需改用Docker手动配置环境,涉及PHP扩展、SQLite3适配及存储路径映射等复杂操作,且安装后需通过WebStation调整脚本语言参数,对非专业用户极不友…...
V4L2杂谈
V4L2的开发手册 在做v4l2的开发的时候, 可以使用v4l2-ctl命令协助调试和软件开发。关于linux多媒体开发可以参考链接:https://www.linuxtv.org/wiki/index.php/Main_Page关于v4l2的api接口开发可以参考:https://linuxtv.org/docs.php在linux…...
Java—HTML:3D形变
今天我要介绍的是在Java HTML中CSS的相关知识点内容之一:3D形变(3D变换)。该内容包含透视(属性:perspective),3D变换,3D变换函数以及案例演示, 接下来我将逐一介绍&…...
Zotero PDF Translate 翻译插件使用OpenAI API配置教程
PDF Translate:提升 Zotero 内置 PDF 阅读器的翻译功能 “PDF Translate” 是一款为 Zotero 设计的插件,旨在方便用户在 Zotero 内置的 PDF 阅读器中进行划词或段落翻译,辅助阅读外文文献。 一、 安装插件 下载插件: 访问 PDF T…...
[raspberrypi 0w and respeaker 2mic]实时音频波形
0. 环境 ubuntu22主机, 192.168.8.162, raspberry 0w, 192.168.8.220 路由器 1. 树莓派 # rpi - send.py # 或者命令行:arecord -D plughw:1,0 -t wav -f cd -r 16000 -c 2 | nc 192.168.8.162 12345import socket imp…...
go-zero自动生成repository文件和测试用例
文章目录 repository的作用自动生成repository文件repo模板文件repo_test模板文件生成结果运行测试用例 repository的作用 在软件开发中,尤其是在采用分层架构或者领域驱动设计(DDD)的项目里,repository(仓库…...
红宝书第三十六讲:持续集成(CI)配置入门指南
红宝书第三十六讲:持续集成(CI)配置入门指南 资料取自《JavaScript高级程序设计(第5版)》。 查看总目录:红宝书学习大纲 一、什么是持续集成? 持续集成(CI)就像咖啡厅的…...
【Java学习】如何利用AI学习Java语言开发(二)
利用AI辅助学习Java语言开发可以显著提高学习效率、解决实际问题和优化代码质量。以下是结合AI工具和方法的系统化学习路径: 一、AI辅助学习基础阶段 智能交互式学习平台 使用Codecademy(AI驱动版)或JetBrains Academy的Java课程,AI会根据你的代码实时提供修正建议 尝试Ch…...
【C++算法】53.链表_重排链表
文章目录 题目链接:题目描述:解法C 算法代码: 题目链接: 143. 重排链表 题目描述: 解法 模拟 找到链表的中间节点 快慢双指针 把后面的部分逆序 双指针,三指针,头插法 合并两个链表 合并两个有…...
Ubuntu安装Docker引擎
安装Docker引擎 一、注意事项 防火墙兼容性 若使用 ufw 或 firewalld,Docker 容器端口会绕过防火墙规则。建议通过 iptables 或 ip6tables 配置防火墙,并将规则添加到 DOCKER-USER 链。仅支持 iptables-nft 和 iptables-legacy࿰…...
[目标检测]2023ICCV:DiffusionDet: Diffusion Model for Object Detection
作者:Shoufa Chen, Peize Sun, Yibing Song, Ping Luo 论文:https://arxiv.org/pdf/2211.09788v2 代码:https://github.com/ShoufaChen/DiffusionDet 摘要 我们提出了一个新的框架DiffusionDet, 将目标检测构建为从噪声框到目标…...
CExercise_09_结构体和枚举_2VS的Debug模式查看它的内存布局,采用结构体数组的方式存储信息,调用函数打印结构体数组.
题目: 下面结构体类型的变量的内存布局是怎样的?请使用VS的Debug模式查看它的内存布局 typedef struct stundent_s {int number;char name[25];char gender;int chinese;int math;int english; } Student;// 结构体对象的声明和初始化 Student s1 { 1, …...
LeetCode 热题 100_零钱兑换(85_322_中等_C++)(动态规划)
LeetCode 热题 100_零钱兑换(85_322) 题目描述:输入输出样例:题解:解题思路:思路一(动态规划): 代码实现代码实现(思路一(动态规划)&a…...
Java——抽象方法抽象类 接口 详解及综合案例
1.抽象方法抽象类 介绍 抽象方法: 将共性的行为(方法)抽取到父类之后, 由于每一个子类执行的内容是不一样, 所以,在父类中不能确定具体的方法体。 该方法就可以定义为抽象方法。 抽象类: 如果一个类中存在抽象方法,那么该类就必须…...
国产芯片解析:LDR6501 Type-C接口OTG充电PD芯片详解
LDR6501 是一款专为 USB Type-C 设备设计的单C口DPR接口PD通信芯片,封装形式为 SOT23-6。此款芯片具有多项实用功能,在耳机转接器、领夹麦克风以及 OTG 转接头等应用中表现出色。 应用领域 耳机转接器:许多新型耳机采用 Type-C 接口&am…...
Payoneer(P卡)会关联吗?如何有效防止P卡关联?
随着跨境电商和全球支付需求的增加,Payoneer(简称P卡)成为了许多商家和个人进行国际支付和收款的重要工具。Payoneer是一种全球支付平台,支持用户跨国收款、汇款,并提供多种货币的账户支持。 许多从事跨境电商的商家和…...
前端基础之《Vue(3)—计算属性》
一、computed选项 1、计算属性 语法:在computed选项中,定义计算属性方法,在方法体使用声明式变量进行若干计算。 2、计算属性一定是个函数。一定有返回值。 3、计算属性的作用 (1)用于优化指令的表达式,…...
【Linux】Linux 权限:数字背后的神秘 “门禁卡” 系统
目录 权限的基本概念Linux上用户的分类超级用户和普通用户用户之间的切换文件访问者的分类 文件属性与访问权限Linux下的文件类型文件后缀在Linux中的作用文件自身的属性【⭐】文件访问者的三种权限【rwx】文件权限值的表示方法 文件访问权限的相关设置方法chmod——设置文件的…...