python算法和数据结构刷题[3]:哈希表、滑动窗口、双指针、回溯算法、贪心算法
回溯算法
「所有可能的结果」,而不是「结果的个数」,一般情况下,我们就知道需要暴力搜索所有的可行解了,可以用「回溯法」。
回溯算法关键在于:不合适就退回上一步。在回溯算法中,递归用于深入到所有可能的分支,而迭代(通常在递归函数内部的循环中体现)用于探索当前层级的所有可能选项。
组合问题
39. 组合总和 - 力扣(LeetCode)
给你一个 无重复元素 的整数数组 candidates
和一个目标整数 target
,找出 candidates
中可以使数字和为目标数 target
的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。
1.路径2.求和3.判断
回溯算法:
在循环中回溯前有改变操作,调用回溯函数判断是否继续回溯,如果结束当前循环的回溯,在回溯后进行操作。
from typing import Listclass Solution:def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:res = []def backtrack(candidates, path, target, start):if sum(path) == target:res.append(path[:])returnif sum(path) > target:returnfor i in range(start, len(candidates)):path.append(candidates[i])backtrack(candidates, path, target, i)path.pop()backtrack(candidates, [], target, 0)return res# 实例化Solution类
solution = Solution()# 定义候选数字列表和目标值
candidates = [2, 3, 6, 7]
target = 7# 调用combinationSum方法并打印结果
combinations = solution.combinationSum(candidates, target)
print(combinations)
17. 电话号码的字母组合 - 力扣(LeetCode)
class Solution:def letterCombinations(self, digits: str) -> List[str]:#数字对应的英文字母列表word_list = ["0", "0", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"]#如果是空字符串直接返回空列表if digits == "":return []#保存结果列表result = []#输入的digits的长度,作为回溯函数返回的判断条件lenth = len(digits)#回溯函数(path当前路径,默认为"")def back_track(digits, index, path):#如果目前path的长度和digits的长度相等,说明已经遍历完一趟,返回结果列表if len(path) == lenth:#加入result列表result.append(path)#返回return#遍历当前索引的数字对应的英文列表for word in word_list[int(digits[index])]:#路径加上当前字母path = path + word#递归下一个数字对应的英文列表back_track(digits, index + 1, path)#撤销当前字母path = path[:-1]back_track(digits, 0, "")return result
分割问题
131. 分割回文串 - 力扣(LeetCode)
class Solution(object):def partition(self, s):# 判断字符串是否为回文self.is_palindrome = lambda s: s == s[::-1]# 初始化结果列表,用于存储所有可能的分割方式result = []# 从空路径开始回溯self.backtrack(s, result, [])return resultdef backtrack(self, s, result, path):# 如果s为空,说明已经处理完所有字符,将当前路径加入结果列表if not s:result.append(path)return# 遍历字符串s,尝试每一种可能的分割方式for i in range(1, len(s) + 1):# 截取当前子串substring = s[:i]# 如果当前子串是回文,则继续递归处理剩余的字符串if self.is_palindrome(substring):# 将当前子串加入路径,并递归处理剩余字符串self.backtrack(s[i:], result, path + [substring])# 实例化Solution类
solution = Solution()# 定义字符串
s = "aab"# 调用partition方法并打印结果
partitions = solution.partition(s)
print(partitions)
子集问题
78. 子集 - 力扣(LeetCode)
给你一个整数数组 nums
,数组中的元素 互不相同 。返回该数组所有可能的子集
start参数和i+1,指示了在递归过程中应该从数组的哪个位置开始考虑元素,以避免重复的组合。
每多一个数增加一次结果
from typing import Listclass Solution:def subsets(self, nums: List[int]) -> List[List[int]]:"""生成给定数字列表的所有可能子集。:param nums: 用于生成子集的整数列表。:return: 包含所有可能子集的列表。"""if not nums:return []res = []n = len(nums)# 定义递归辅助函数,用于回溯生成子集def backtrack(start: int, current_subset: List[int]):"""回溯辅助函数。:param start: 当前子集开始遍历的索引。:param current_subset: 当前正在构建的子集。"""# 将当前子集的副本添加到结果列表中res.append(current_subset[:])# 遍历剩余元素,尝试将其加入到子集中for i in range(start, n):# 将当前元素加入到子集,并递归继续构建子集backtrack(i + 1, current_subset + [nums[i]])# 从空子集开始回溯过程backtrack(0, [])return res# 示例用法:
solution = Solution()
print(solution.subsets([1, 2, 3]))
排列问题
46. 全排列 - 力扣(LeetCode)
from typing import Listclass Solution:def permute(self, nums: List[int]) -> List[List[int]]:def backtrack(start, end):# 所有数都填完了,将当前排列加入结果集if start == end:res.append(nums[:])for i in range(start, end):# 交换前缀,将第 i 个元素固定在第 start 位nums[start], nums[i] = nums[i], nums[start]# 递归填下一个数backtrack(start + 1, end)# 撤销操作nums[start], nums[i] = nums[i], nums[start]res = []backtrack(0, len(nums))return res# 实例化并调用
solution = Solution()
nums = [1, 2, 3]
print(solution.permute(nums))
每循环完列表一次添加一次结果
棋盘问题
51. N 皇后 - 力扣(LeetCode)
class Solution:def solveNQueens(self, n: int) -> List[List[str]]:# 从上往下放棋子# 按照row从小到大放置皇后board = [['.'] * n for _ in range(n)]res = []# 表示board中小于row的那些行(row上面的那些行)已经放置皇后了# 这一步开始往第row行放皇后def backtrack(row):n = len(board)# 如果到最后一行了,则将结果添加到res里if row == n:tmp = [''.join(i) for i in board]res.append(tmp)returnfor col in range(n):if not self.isValid(board, row, col):continueboard[row][col] = 'Q'backtrack(row + 1)board[row][col] = '.'backtrack(0)return res # 查看是否可以在board[row][col]的位置放置皇后def isValid(self, board, row, col):n = len(board)# 查看上方是否有Qfor i in range(row):if board[i][col] == 'Q':return False# 查看右上方是否有Qfor i, j in zip(range(row - 1, -1, -1), range(col + 1, n, 1)):if board[i][j] == 'Q':return False# 查看左上方是否有Qfor i, j in zip(range(row - 1, -1, -1), range(col - 1, -1, -1)):if board[i][j] == 'Q':return Falsereturn True 作者:山鬼TJU
79. 单词搜索 - 力扣(LeetCode)
class Solution(object):# 定义上下左右四个行走方向directs = [(0, 1), (0, -1), (1, 0), (-1, 0)]def exist(self, board, word):""":type board: List[List[str]]:type word: str:rtype: bool"""m = len(board)if m == 0:return Falsen = len(board[0])mark = [[0 for _ in range(n)] for _ in range(m)]for i in range(len(board)):for j in range(len(board[0])):if board[i][j] == word[0]:# 将该元素标记为已使用mark[i][j] = 1if self.backtrack(i, j, mark, board, word[1:]) == True:return Trueelse:# 回溯mark[i][j] = 0return Falsedef backtrack(self, i, j, mark, board, word):if len(word) == 0:return Truefor direct in self.directs:cur_i = i + direct[0]cur_j = j + direct[1]if cur_i >= 0 and cur_i < len(board) and cur_j >= 0 and cur_j < len(board[0]) and board[cur_i][cur_j] == word[0]:# 如果是已经使用过的元素,忽略if mark[cur_i][cur_j] == 1:continue# 将该元素标记为已使用mark[cur_i][cur_j] = 1if self.backtrack(cur_i, cur_j, mark, board, word[1:]) == True:return Trueelse:# 回溯mark[cur_i][cur_j] = 0return False
22. 括号生成 - 力扣(LeetCode)
可以插入 )
的前提是 (
的数量大于 )
class Solution(object):def generateParenthesis(self, n):""":type n: int:rtype: List[str]"""res = []self.dfs(res, n, n, '')return resdef dfs(self, res, left, right, path):if left == 0 and right == 0:res.append(path)returnif left > 0:self.dfs(res, left - 1, right, path + '(')if left < right:self.dfs(res, left, right - 1, path + ')')
贪心算法
例如,有一堆钞票,你可以拿走十张,如果想达到最大的金额,你要怎么拿?
指定每次拿最大的,最终结果就是拿走最大数额的钱。
每次拿最大的就是局部最优,最后拿走最大数额的钱就是推出全局最优。
- 将问题分解为若干个子问题
- 找出适合的贪心策略
- 求解每一个子问题的最优解
- 将局部最优解堆叠成全局最优解
121. 买卖股票的最佳时机 - 力扣(LeetCode)
因为股票就买卖一次,那么贪心的想法很自然就是取最左最小值,取最右最大值,那么得到的差值就是最大利润。
def max_profit(prices):if not prices:return 0max_profit = 0min_price = prices[0]for price in prices:# 更新到目前为止遇到的最小价格min_price = min(min_price, price)# 计算在当前价格卖出时的利润,并更新最大利润max_profit = max(max_profit, price - min_price)return max_profit# 示例
prices = [7, 1, 5, 3, 6, 4]
print(max_profit(prices)) # 输出应为 5
55. 跳跃游戏 - 力扣(LeetCode)
def can_jump(nums):# 最远能到达的位置max_reach = 0# 遍历数组for i, num in enumerate(nums):# 如果当前位置超过最远能到达的位置,说明无法到达当前位置if i > max_reach:return False# 更新最远能到达的位置max_reach = max(max_reach, i + num)# 如果最远能到达的位置已经覆盖了最后一个下标,则可以到达if max_reach >= len(nums) - 1:return Truereturn True# 示例
nums = [2, 3, 1, 1, 4]
print(can_jump(nums)) # 输出应为 True
45. 跳跃游戏 II - 力扣(LeetCode)
def min_jumps(nums):n = len(nums)# 如果数组只有一个元素,不需要跳跃if n <= 1:return 0# 当前跳跃能到达的最远位置current_end = 0# 下一步跳跃能到达的最远位置farthest = 0# 跳跃次数jumps = 0# 遍历数组,但不包括最后一个元素,因为目标是在最后一个元素处停止for i in range(n - 1):# 更新最远能到达的位置farthest = max(farthest, i + nums[i])# 如果到达了当前跳跃的边界if i == current_end:# 增加跳跃次数jumps += 1# 更新当前跳跃的边界current_end = farthest# 如果当前跳跃的边界已经覆盖了最后一个元素,则可以停止if current_end >= n - 1:breakreturn jumps# 示例
nums = [2, 3, 1, 1, 4]
print(min_jumps(nums)) # 输出应为 2
763. 划分字母区间 - 力扣(LeetCode)
def partitionLabels(s):# 记录每个字符最后出现的位置last = {c: i for i, c in enumerate(s)}ans = []start = end = 0# 遍历字符串for i, c in enumerate(s):# 更新当前片段的结束位置end = max(end, last[c])# 如果当前位置是当前片段的结束位置if i == end:# 记录当前片段的长度ans.append(end - start + 1)# 更新下一个片段的开始位置start = end + 1return ans# 示例
s = "ababcbacadefegdehijhklij"
print(partitionLabels(s)) # 输出
哈希表
1. 两数之和 - 力扣(LeetCode)
创建一个哈希表,对于每一个 x
,我们首先查询哈希表中是否存在 target - x
,然后将 x
插入到哈希表中,即可保证不会让 x
和自己匹配。
class Solution:def twoSum(self, nums: List[int], target: int) -> List[int]:hashtable = dict()for i, num in enumerate(nums):if target - num in hashtable:return [hashtable[target - num], i]hashtable[nums[i]] = ireturn []
49. 字母异位词分组 - 力扣(LeetCode)
class Solution:def groupAnagrams(self, strings: List[str]) -> List[List[str]]:mp = collections.defaultdict(list) # define a map from str to list of strfor string in strings:key = "".join(sorted(string))mp[key].append(string)return list(mp.values())
128. 最长连续序列 - 力扣(LeetCode)
class Solution:def longestConsecutive(self, nums: List[int]) -> int:ans = 0st = set(nums) # 把 nums 转成哈希集合for x in st: # 遍历哈希集合if x - 1 in st:continue# x 是序列的起点y = x + 1while y in st: # 不断查找下一个数是否在哈希集合中y += 1# 循环结束后,y-1 是最后一个在哈希集合中的数ans = max(ans, y - x) # 从 x 到 y-1 一共 y-x 个数return ans作者:灵茶山艾府
560. 和为 K 的子数组 - 力扣(LeetCode)
前后缀分解+哈希表
前缀和指一个数组的某下标之前的所有数组元素的和(包含其自身)
from collections import defaultdictclass Solution:def subarraySum(self, nums: list, k: int) -> int:# 初始化计数器,用于记录和为k的子数组的数量count = 0n = len(nums)# 使用defaultdict来存储前缀和出现的次数,初始时前缀和为0出现1次preSums = defaultdict(int)preSums[0] = 1# 初始化前缀和为0presum = 0# 遍历数组中的每个元素for i in range(n):# 更新当前的前缀和presum += nums[i]# 如果存在某个前缀和等于当前前缀和减去k,则说明存在一个子数组的和为k# defaultdict的特性使得当key不存在时返回0,所以这里不需要判断key是否存在count += preSums[presum - k]# 将当前前缀和出现的次数加1preSums[presum] += 1# 返回和为k的子数组的数量return count
双指针
283. 移动零 - 力扣(LeetCode)
快慢指针,当碰到0时i会比i0走的快
from typing import Listclass Solution:def moveZeroes(self, nums: List[int]) -> None:# 初始化一个指针i0,用于指向下一个非零元素应该放置的位置i0 = 0# 遍历数组中的每个元素for i in range(len(nums)):# 如果当前元素不是0,则将其与i0指向的位置的元素交换if nums[i]:# 交换元素,将非零元素移动到i0指向的位置nums[i], nums[i0] = nums[i0], nums[i]# 移动i0指针到下一个位置i0 += 1# 注意:这个方法直接修改了输入的数组,不需要返回值
11. 盛最多水的容器 - 力扣(LeetCode)
对撞指针两个指针列表一边一个向中间靠近,同时根据两者的高度判断两个指针是否前进
class Solution:def maxArea(self, height: List[int]) -> int:ans = left = 0right = len(height) - 1while left < right:area = (right - left) * min(height[left], height[right])ans = max(ans, area)if height[left] < height[right]:# height[left] 与右边的任意线段都无法组成一个比 ans 更大的面积left += 1else:# height[right] 与左边的任意线段都无法组成一个比 ans 更大的面积right -= 1return ans
42. 接雨水 - 力扣(LeetCode)
对撞指针
from typing import Listclass Solution:def trap(self, height: List[int]) -> int:# 初始化答案变量、左指针、前缀最大高度、后缀最大高度ans = left = pre_max = suf_max = 0# 初始化右指针指向数组的最后一个元素right = len(height) - 1# 当左指针小于右指针时,继续循环while left < right:# 更新当前左指针指向的柱子的前缀最大高度pre_max = max(pre_max, height[left])# 更新当前右指针指向的柱子的后缀最大高度suf_max = max(suf_max, height[right])# 如果左指针的前缀最大高度小于右指针的后缀最大高度if pre_max < suf_max:# 计算当前左指针位置可以捕获的水量,并累加到答案中ans += pre_max - height[left]# 移动左指针到下一个位置left += 1else:# 计算当前右指针位置可以捕获的水量,并累加到答案中ans += suf_max - height[right]# 移动右指针到下一个位置right -= 1# 返回计算出的总水量return ans
15. 三数之和 - 力扣(LeetCode)
def threeSum(nums):# 首先对数组进行排序nums.sort()result = []# 遍历数组,直到倒数第三个元素for i in range(len(nums) - 2):# 如果当前数字大于0,则后面的数字都大于0,不可能和为0,直接返回结果if nums[i] > 0:return result# 跳过可能重复的数字if i > 0 and nums[i] == nums[i - 1]:continue# 初始化双指针left, right = i + 1, len(nums) - 1# 使用双指针遍历while left < right:total = nums[i] + nums[left] + nums[right]# 如果三数之和小于0,左指针右移if total < 0:left += 1# 如果三数之和大于0,右指针左移elif total > 0:right -= 1# 如果三数之和等于0,添加到结果中,并移动左右指针else:result.append([nums[i], nums[left], nums[right]])# 跳过可能重复的数字while left < right and nums[left] == nums[left + 1]:left += 1while left < right and nums[right] == nums[right - 1]:right -= 1left += 1right -= 1return result# 示例
nums = [-1, 0, 1, 2, -1, -4]
print(threeSum(nums)) # 输出应为[[-1, -1, 2], [-1, 0, 1]]
滑动窗口
在滑动窗口中,通常会使用两个指针,这两个指针分别被称为“快指针”和“慢指针”(也有其他叫法,如“左指针”和“右指针”),它们在数组或链表上移动以维护一个窗口。
- 快指针(右指针):通常用于扩展窗口,即向右移动,探索新的元素。
- 慢指针(左指针):通常用于收缩窗口,即向右移动,移除窗口中的元素。
3. 无重复字符的最长子串 - 力扣(LeetCode)
给定一个字符串 s
,请你找出其中不含有重复字符的 最长子串的长度。
class Solution:def lengthOfLongestSubstring(self, s: str) -> int:left,right = 0,0res = 0if len(s) == 0:return 0if s.count(s[0]) == len(s):return 1if len(set(s)) == len(s):return len(s)while right < len(s):if s[right] not in s[left:right]:right +=1res = max(res,len(s[left:right]))else:while s[right] in s[left:right]:left +=1return res
438. 找到字符串中所有字母异位词 - 力扣(LeetCode)
class Solution:def findAnagrams(self, s: str, p: str) -> list:n, m, res = len(s), len(p), [] # 初始化字符串s和p的长度,以及结果列表if n < m: return res # 如果s的长度小于p,则不可能包含异位词,直接返回空列表# 初始化两个长度为26的数组,用于存储字符计数p_cnt = [0] * 26s_cnt = [0] * 26# 统计字符串p中每个字符的出现次数for i in range(m):p_cnt[ord(p[i]) - ord('a')] += 1left = 0 # 初始化滑动窗口的左边界for right in range(n): # 遍历字符串scur_right = ord(s[right]) - ord('a') # 计算当前字符在数组中的索引s_cnt[cur_right] += 1 # 增加当前字符的计数# 如果当前字符在s中的出现次数超过了在p中的出现次数,移动左边界while s_cnt[cur_right] > p_cnt[cur_right]:cur_left = ord(s[left]) - ord('a') # 计算左边界字符在数组中的索引s_cnt[cur_left] -= 1 # 减少左边界字符的计数left += 1 # 移动左边界# 如果滑动窗口的大小等于p的长度,则找到了一个异位词if right - left + 1 == m:res.append(left) # 将左边界索引添加到结果列表中return res # 返回所有异位词的起始索引列表
239. 滑动窗口最大值 - 力扣(LeetCode)
单调递减的双端队列来保存窗口中的元素索引,确保队列的首部始终是当前窗口的最大值的索引。
双端队列:deque允许在队列的两端进行插入和删除操作。
from collections import dequedef maxSlidingWindow(nums, k):if not nums or k == 0:return []deque = deque() # 存储元素索引的单调队列result = [] # 存储结果for i in range(len(nums)):# 移除所有小于当前元素的索引while deque and nums[deque[-1]] <= nums[i]:deque.pop()# 将当前元素的索引加入队列deque.append(i)# 移除不在窗口内的索引if deque[0] < i - k + 1:deque.popleft()# 当窗口大小达到 k 时,记录当前窗口的最大值if i >= k - 1:result.append(nums[deque[0]])return result
76. 最小覆盖子串 - 力扣(LeetCode)
- 初始化两个指针,
left
和right
,它们分别表示滑动窗口的左右边界。 - 使用两个哈希表(或字典)来记录当前窗口中的字符频率和目标字符串
t
中字符的频率。 - 扩展
right
指针来增加窗口的大小,直到窗口包含了t
中所有的字符。 - 一旦窗口包含了
t
中所有的字符,尝试通过移动left
指针来缩小窗口的大小,同时保持窗口包含t
中所有的字符。 - 在每次移动
left
指针时,如果窗口仍然包含t
中所有的字符,则更新最小子串的长度和起始位置。 - 重复步骤 3 和 4,直到
right
指针到达字符串s
的末尾。
def min_window(s, t):if not t or not s:return ""# 初始化需要的字符及其频率need = {}for char in t:need[char] = need.get(char, 0) + 1#从字典中获取 char 对应的值。如果 char 不在字典中,则返回默认值 0# 初始化窗口中的字符及其频率window = {}valid = 0 # 用于记录窗口中满足 need 条件的字符个数left, right = 0, 0start, length = 0, float('inf') # 最小子串的起始位置和长度while right < len(s):# 即将移入窗口的字符c = s[right]# 右移窗口right += 1# 更新窗口中的字符频率if c in need:window[c] = window.get(c, 0) + 1if window[c] == need[c]:valid += 1# 判断左侧窗口是否要收缩while valid == len(need):# 更新最小子串if right - left < length:start = leftlength = right - left# 即将移出窗口的字符d = s[left]# 左移窗口left += 1# 更新窗口中的字符频率if d in need:if window[d] == need[d]:valid -= 1window[d] -= 1# 返回最小子串return "" if length == float('inf') else s[start:start + length]# 示例
s = "ADOBECODEBANC"
t = "ABC"
print(min_window(s, t)) # 输出 "BANC"
广度优先搜索算法基本用的就是队列,深度优先搜索算法(DFS)用的基本都是递归
相关文章:
python算法和数据结构刷题[3]:哈希表、滑动窗口、双指针、回溯算法、贪心算法
回溯算法 「所有可能的结果」,而不是「结果的个数」,一般情况下,我们就知道需要暴力搜索所有的可行解了,可以用「回溯法」。 回溯算法关键在于:不合适就退回上一步。在回溯算法中,递归用于深入到所有可能的分支&…...
JDK 中 NIO 框架设计与实现:深入剖析及实战样例
一、引言 在 Java 的发展历程中,I/O(Input/Output)操作一直是构建高效、稳定应用程序的关键环节。传统的 Java I/O 操作基于流(Stream)的方式,虽然简单易用,但在面对高并发、大规模数据传输等场…...
基于springboot校园点歌系统
基于Spring Boot的校园点歌系统是一种专为校园场景设计的音乐点播平台,它能够丰富学生的校园生活,提升学生的娱乐体验。以下是对该系统的详细介绍: 一、系统背景与意义 在校园环境中,学生们对于音乐有着浓厚的兴趣,传…...
Spring 核心技术解析【纯干货版】- IX:Spring 数据访问模块 Spring-Jdbc 模块精讲
在现代企业级应用中,数据访问层的稳定性和高效性至关重要。为了简化和优化数据库操作,Spring Framework 提供了 Spring-JDBC 模块,旨在通过高度封装的 JDBC 操作,简化开发者的编码负担,减少冗余代码,同时提…...
React开发中箭头函数返回值陷阱的深度解析
React开发中箭头函数返回值陷阱的深度解析 一、箭头函数的隐式返回机制:简洁背后的规则二、块函数体中的显式返回要求:容易被忽视的细节三、真实场景下的案例分析案例1:忘记return导致组件渲染失败案例2:异步操作中的返回值陷阱 四…...
线程同步时定义 std::mutex 为什么要在前面添加 mutable 关键字
在C中,mutable关键字用于修饰类的成员变量,表示即使在一个const对象中,该成员变量也可以被修改。对于mutex这样的同步原语,使用mutable是必要的,原因如下: 1. 为什么需要 mutable? mutex通常用…...
【多线程】线程池核心数到底如何配置?
🥰🥰🥰来都来了,不妨点个关注叭! 👉博客主页:欢迎各位大佬!👈 文章目录 1. 前置回顾2. 动态线程池2.1 JMX 的介绍2.1.1 MBeans 介绍 2.2 使用 JMX jconsole 实现动态修改线程池2.2.…...
Linux find 命令 | grep 命令 | 查找 / 列出文件或目录路径 | 示例
注:本文为 “Linux find 命令 | grep 命令使用” 相关文章合辑。 未整理去重。 如何在 Linux 中查找文件 作者: Lewis Cowles 译者: LCTT geekpi | 2018-04-28 07:09 使用简单的命令在 Linux 下基于类型、内容等快速查找文件。 如果你是 W…...
爬楼梯(dp)杭电复试
一个楼梯共有 nn 级台阶,每次可以走一级或者两级或者三级,问从第 00 级台阶走到第 nn 级台阶一共有多少种方案。 输入格式 一个整数 NN。 输出格式 一个整数,表示方案总数。 数据范围 1≤N≤201≤N≤20 输入样例: 4输出样…...
JVM执行引擎
一、执行引擎的概述: 执行引擎是]ava虚拟机核心的组成部分之一; “虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则…...
企业四要素如何用PHP进行调用
一、什么是企业四要素? 企业四要素接口是在企业三要素(企业名称、统一社会信用代码、法定代表人姓名)的基础上,增加了一个关键要素,通常是企业注册号或企业银行账户信息。这种接口主要用于更全面的企业信息验证&#x…...
基于springboot河南省旅游管理系统
基于Spring Boot的河南省旅游管理系统是一种专为河南省旅游行业设计的信息管理系统,旨在整合和管理河南省的旅游资源信息,为游客提供准确、全面的旅游攻略和服务。以下是对该系统的详细介绍: 一、系统背景与意义 河南省作为中国的中部省份&…...
arm 下 多线程访问同一变量 ,使用原子操作 性能差问题
arm下原子操作性能差的原因 Linux Kernel(armv8-aarch64) 的原子操作的底层实现 - 极术社区 - 连接开发者与智能计算生态 arm 下如何解决 ARMs LSE (for atomics) and MySQL – MySQL On ARM – All you need to know about MySQL (and its variants) on ARM. arm 下lse 和…...
嵌入式工程师必学(143):模拟信号链基础
概述: 我们每天使用的许多电子设备,以及我们赖以生存的电子设备,如果不使用电子工程师设计的实际输入信号,就无法运行。 模拟信号链由四个主要元件组成:传感器、放大器、滤波器和模数转换器 (ADC)。这些传感器用于检测、调节模拟信号并将其转换为适合由微控制器或其他数…...
PyQt6/PySide6 的 QDialog 类
QDialog 是 PyQt6 或 PySide6 库中用于创建对话框的类。对话框是一种特殊的窗口,通常用于与用户进行短期交互,如输入信息、显示消息或选择选项等。QDialog 提供了丰富的功能和灵活性,使得开发者可以轻松地创建各种类型的对话框。下面我将详细…...
【AI日记】25.02.05 自由不是一种工具
【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】【读书与思考】 AI kaggle 比赛:Backpack Prediction Challenge感想:这次比赛的数据集的一大特点是信号过弱或者噪声过大,也是一大难点,即使kaggle 官方增加了一…...
【原子工具】快速幂 快速乘
题幂算.一切即1 阴阳迭变积微著,叠浪层峦瞬息功 莫道浮生千万事,元知万象一归宗 文章目录 快速幂原始快速幂(O(logn))二分递归形式非递归形式 模下意义的快速幂(O(logn))二分递归形式非递归形式 快速乘龟速…...
2024年12月 Scratch 图形化(四级)真题解析 中国电子学会全国青少年软件编程等级考试
202412 Scratch 图形化(四级)真题解析 中国电子学会全国青少年软件编程等级考试 一、选择题(共10题,共30分) 第 1 题 列表存放全班同学的身高,小猫运行下列程序,下列选项说法正确的是?( &#…...
【面试宝典】机器学习:深度解析高频面试题与解答策略
目录 🍔 机器学习中特征的理解 🍔 机器学习三要素如何理解? 🍔 机器学习中,有哪些特征选择的⼯程⽅法? 🍔 机器学习中的正负样本 🍔 线性分类器与⾮线性分类器的区别及优劣 🍔…...
使用 ElementUI 和 Spring 实现稳定可靠的文件上传和下载功能
前端(ElementUI) 1. 文件上传 使用 el-upload 组件配置上传接口处理上传成功和失败<template><div><el-uploadclass="upload-demo"action="http://your-server-url/upload":on-success="handleSuccess":on-error="handle…...
Linux驱动---字符设备
目录 一、基础简介 1.1、Linux设备驱动分类 1.2、字符设备驱动概念 二、驱动基本构成 2.1、驱动模块的加载和卸载 2.2、添加LICENNSE以及其他信息 三、字符设备驱动开发步骤 3.1、分配主次设备号 3.1.1 主次设备号 3.1.2静态注册设备号 3.1.3动态注册设备号 3.1.4释…...
FastReport.NET控件篇之交叉表控件
认识交叉表 上面是交叉表的原型,关键的三个单元格。 单元格①:用于扩展行数据,譬如打印学生成绩表时,每个学生一行,那么这个地方就是以学生姓名列进行打印。 单元格②:用于扩展列数据,譬如打印…...
构建高效复杂系统的关键:架构与模块详解
目录 一、复杂系统组成 二、接入系统 (Access System) 三、应用系统 (Application System) 四、基础平台 (Foundation Platform) 五、中间件 (Abundant External Middleware) 六、支撑系统 (Supporting System) 七、总结 参考文章 干货分享,感谢您的阅读&am…...
C++之递归
递归 递归函数是指一个函数直接或间接地调用自身。递归函数通常用于解决可以分解为相似子问题的问题,例如计算阶乘、斐波那契数列、遍历树结构等 基本结构 一个递归函数通常包含两个部分: 基准条件(Base Case):这是…...
pushgateway指标聚合问题
一 问题现象 一个job有多个实例推送指标,但是从pushgateway上看这个job的instance字段,只显示一个实例的ip,而不是多个实例。导致在grafana上无法正常根据ip查看监控。 应用的prometheus的配置 management:metrics:tags:application: ${spr…...
mini-lsm通关笔记Week2Day7
项目地址:https://github.com/skyzh/mini-lsm 个人实现地址:https://gitee.com/cnyuyang/mini-lsm 在上一章中,您已经构建了一个完整的基于LSM的存储引擎。在本周末,我们将实现存储引擎的一些简单但重要的优化。欢迎来到Mini-LSM的…...
[权限提升] Windows 提权 维持 — 系统错误配置提权 - 注册表权限配置错误提权
关注这个专栏的其他相关笔记:[内网安全] 内网渗透 - 学习手册-CSDN博客 0x01:注册表权限配置错误提权原理 通常 Windows 中的服务都是以 System 权限运行的,而 Windows 的服务程序的启动路径又是存放在注册表中的,若注册表配置不…...
产品经理的人工智能课 02 - 自然语言处理
产品经理的人工智能课 02 - 自然语言处理 1 自然语言处理是什么2 一个 NLP 算法的例子——n-gram 模型3 预处理与重要概念3.1 分词 Token3.2 词向量化表示与 Word2Vec 4 与大语言模型的交互过程参考链接 大语言模型(Large Language Models, LLMs)是自然语…...
软件工程导论三级项目报告--《软件工程》课程网站
《软件工程》课程网站 摘要 本文详细介绍了《软件工程》课程网站的设计与实现方案,包括可行性分析、需求分析、总体设计、详细设计、测试用例。首先,通过可行性分析从各方面确认了该工程的可实现性,接着需求分析明确了系统的目标用户群和功能…...
FPGA|IP核PLL调用测试:调用IP核
1、选择tools-》Megawizard plug-In manager 2、选择第一项,下一步 3、选择ATPLL,芯片系列、和输出文件类型,输出文件名称,单击next 4、出现配置PLL界面 5、选择输入时钟频率,单击next 6、生成reset、和locked信号&…...
leetcode_双指针 160.相交链表
160.相交链表 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 思路: 本题中,交点不是数值相等,而是指针相等 双指针遍历两遍后必定相遇,…...
TongSearch3.0.4.0安装和使用指引(by lqw)
文章目录 安装准备手册说明支持的数据类型安装控制台安装单节点(如需集群请跳过这一节)解压和启动开启X-Pack Security和生成p12证书(之后配置内置密码和ssl要用到)配置内置用户密码配置ssl(先配置内置用户密码再配ssl)配置控制台…...
2021.3.1的android studio版本就很好用
使用最新版的studio有个问题就是gradle版本也比较高,这样就容易出现之前项目不兼容问题,配置gradle可能会出现很多问题比较烦,所以干脆就用老版本的studio...
提示词实践总结
目录 一、要求创建SqlServer表(ChatGpt) 二、要求生成多层架构代码(Cursor) 三、要求修改方法返回值类型(Cursor) 四、要求修改方法入参(Cursor) 五、复杂的多表关联生成&#…...
【Elasticsearch】Filters聚合
Filters聚合的基本语法 Filters聚合是一种多桶聚合,用于将文档分组到多个桶中,每个桶对应一个过滤条件。以下是Filters聚合的基本语法和结构: 1.基本结构 json { "aggs": { "<aggregation_name>": { "filter…...
Java基础面试题50题
1,""空字符串的作用 package com.neuedu.nineteen;public class Test {public static void main(String[] args) {String s"";for (char i a; i < d; i) {ssi;//输出abc // sis;//输出cba}System.out.println(s);} }如题所示&…...
Django框架的全面指南:从入门到高级
Django框架的全面指南:从入门到高级 目录 引言Django简介安装与配置创建第一个Django项目Django的MVT架构模型(Model)视图(View)模板(Template)URL路由表单处理用户认证与权限Django Admin高级…...
c++继承
继承的概念和定义 继承的概念 继承 (inheritance) 机制是面向对象程序设计 使代码可以复用 的最重要的手段,它允许程序员在 保 持原有类特性的基础上进行扩展 ,增加功能,这样产生新的类,称派生类。继承 呈现了面向对象 程序设计的…...
【Linux系统】分页式存储管理
分页式存储管理 1、虚拟地址和页表的由来 思考一下,如果在没有虚拟内存和分页机制的情况下,每一个用户程序在物理内存上所对应的空间必须是连续的,如下图: 因为每一个程序的代码、数据长度都是不一样的,按照这样的映射…...
cmd执行mysql命令
安装mysql之后如果想使用cmd执行mysql命令,需要怎么操作呢,下面一起看一下。 安装mysql之后,如果直接去cmd窗口执行MySQL命令,窗口可能会提示mysql不是可执行命令。 需要配置系统的环境变量,将mysql的安装路径配置系…...
第一天:Linux内核架构、文件系统和进程管理
目录 Linux核心概念学习笔记一、Linux内核架构(一)内核的任务(二)实现策略(三)内核的组成部分(四)内核源文件目录结构二、Linux文件系统(一)文件系统架构(二)虚拟文件系统的数据结构三、Linux进程管理(一)进程相关概念(二)进程的层次结构(三)新进程创建机制(…...
QT:信号和槽
目录 1.概念 2.信号和槽的使用 2.1代码的方式使用 2.1.1.使用connect关联 2.2图形化界面的方式使用 2.2.1使用流程 2.2.2使用名字关联槽函数 3.自定义信号和槽函数 3.1自定义槽函数 3.2自定义信号 4.总结 1.概念 信号和槽是QT特有的一种机制,信号和槽都是…...
【Linux系统】线程:认识线程、线程与进程统一理解
一、更新认知 之前的认知 进程:一个执行起来的程序。进程 内核数据结构 代码和数据线程:执行流,执行粒度比进程要更细。是进程内部的一个执行分值 更新认识: a. 进程是承担分配系统资源的基本实体b. 线程是OS调度的基本单位 …...
蓝桥杯字串简写(二分)
输入 4 abababdb a b 输出 6 思路: 如果暴力,o(n**2),超时,想到可以先与处理一下,记录c1出现的位置,再根据c2的位置用二分法看前面有多少个符合条件的c1。 why二分: 代码:一些…...
【C语言】指针详细解读3
1. 数组名的理解 我们使用指针一般访问数组内容时,我们可能会这样写: int arr[10] {1,2,3,4,5,6,7,8,9,10}; int *p &arr[0]; 这⾥我们使⽤ &arr[0] 的⽅式拿到了数组第⼀个元素的地址,但是其实数组名本来就是地址,⽽…...
Python爬虫-如何正确解决起点中文网的无限debugger
前言 本文是该专栏的第45篇,后面会持续分享python爬虫干货知识,记得关注。 本文以起点中文网为例子,针对起点中文网使用控制台调试出现无限debugger的情况,要如何解决? 针对该问题,笔者在正文将介绍详细而又轻松的解决方法。废话不多说,下面跟着笔者直接往下看正文详细…...
畅游Diffusion数字人(15):详细解读字节跳动最新论文——音频+姿态控制人类视频生成OmniHuman-1
Diffusion models代码解读:入门与实战 前言:昨晚字节跳动刚发布了一篇音频+姿态控制人类视频生成OmniHuman-1的论文,效果非常炸裂,并且是基于最新的MM-DiT架构,今天博主详细解读一下这一技术。 目录 贡献概述 方法详解 音频条件注入 Pose条件注入 参考图片条件注入 …...
Windows图形界面(GUI)-QT-C/C++ - QT Dock Widget
公开视频 -> 链接点击跳转公开课程博客首页 -> 链接点击跳转博客主页 目录 一、概述 二、使用场景 1. 工具栏 2. 侧边栏 3. 调试窗口 三、常见样式 1. 停靠位置 2. 浮动窗口 3. 可关闭 4. 可移动 四、属性设置 1. 设置内容 2. 获取内容 3. 设置标题 …...
MIT AppInventor v2.74更新的内容
MIT v2.74更新的内容如下: 新的 UI 选择器提示 向菜单、调色板和设计视图添加键盘导航 更新至 Google Blockly 版本 10 按住 Shift 并拖动以选择多个块 当值被拖近并且没有空闲插槽时,文本等块会自动合并并展开列表 将块拖到边缘时工作区会自动滚动 新的…...
使用 Ollama 在 Windows 环境部署 DeepSeek 大模型实战指南
文章目录 前言Ollama核心特性 实战步骤安装 Ollama验证安装结果部署 DeepSeek 模型拉取模型启动模型 交互体验命令行对话调用 REST API 总结个人简介 前言 近年来,大语言模型(LLM)的应用逐渐成为技术热点,而 DeepSeek 作为国产开…...