掘友等级
获得徽章 8
#刷题交流#
哈夫曼编码是一种用于数据压缩的算法,由大卫·哈夫曼在1952年提出。其主要原理是利用字符出现的频率来构建一棵二叉树,从而生成可变长度的编码,使得常用字符的编码较短,而不常用字符的编码较长,从而在整体上实现数据压缩。
#刷题交流#
打卡、128、《找出最长的神奇数列》
这个问题主要运用了滑动窗口和双指针的思想。
滑动窗口:用于动态地扩展和收缩当前正在检查的子序列。
双指针:用于遍历序列并记录当前子序列的起始位置和长度。
解题之后用MarsCode AI 提取算法思想,加深理解
#刷题交流#
打卡、今日刷题,线上报警问题分类,解题思路:
初始化用户实验集合、遍历 arrayN,将每个用户的实验命中情况存储在集合中。
处理查询、对于每次查询,遍历所有用户,检查其实验命中情况是否符合查询条件。
使用一个辅助函数 check_user_matches_query 来检查用户是否符合当前查询条件。
返回结果、将每次查询的结果存储在列表中,并返回该列表。
#刷题交流#
补卡:43、《还原原始字符串》的中使用用于 BFS 来模拟操作过程。
BFS(Breadth-First Search,广度优先搜索)是一种用于图和树的遍历算法。它从根节点(或起始节点)开始,逐层遍历图或树的节点,直到找到目标节点或遍历完所有节点。BFS 通常使用队列(Queue)来实现,确保每一层的节点都被访问后再访问下一层的节点。
def bfs(graph, start):
# 初始化队列和已访问集合
queue = deque([start])
visited = set([start])
while queue:
node = queue.popleft()
print(node) # 访问节点
# 遍历当前节点的邻居节点
for neighbor in graph[node]:
if neighbor not in visited:
visited.add(neighbor)
queue.append(neighbor)
#刷题交流#
打卡,16、《最大矩形面积》解题思路:
初始化:
创建一个空栈 stack,用于存储数组索引。
初始化 max_area 为 0,用于存储最大矩形面积。
初始化 index 为 0,用于遍历数组。
遍历数组:
当 index 小于数组长度 n 时,执行以下操作:
如果栈为空,或者当前元素的高度大于或等于栈顶元素的高度,将当前索引 index 压入栈中,并将 index 增加 1。
否则,弹出栈顶元素 top_of_stack,计算以 top_of_stack 为最小高度的矩形面积,并更新 max_area。
处理栈中剩余元素:
遍历结束后,栈中可能还剩余一些元素。依次弹出栈顶元素,计算以该元素为最小高度的矩形面积,并更新 max_area。
#刷题交流#
查找最长无重复子串的问题的解题思路:
1、使用两个指针,一个表示当前子串的开始(左指针),一个表示当前子串的结束(右指针)。
2、使用一个集合来存储当前子串中的字符。
3、每次右指针向右移动,检查当前字符是否在集合中:
4、如果在,就移动左指针,直到移除重复字符。
5、如果不在,就将字符添加到集合中,并更新最大长度。
6、重复这个过程,直到右指针遍历完整个字符串。
function lengthOfLongestSubstring(s) {
const charSet = new Set(); // 用于存储无重复字符
let left = 0; // 左指针
let maxLength = 0; // 记录最大长度
for (let right = 0; right < s.length; right++) {
// 当右指针指向的字符在集合中,移动左指针
while (charSet.has(s[right])) {
charSet.delete(s[left]);
left++;
}
// 添加右指针指向的字符到集合中
charSet.add(s[right]);
// 更新最大长度
maxLength = Math.max(maxLength, right - left + 1);
}
return maxLength;
}
const inputString = "abcabcbb";
console.log(lengthOfLongestSubstring(inputString)); // 输出: 3 ("abc" 是最长无重复子串)
#刷题交流#
动态规划的应用:有 n 阶台阶,每次可以爬 1 阶或 2 阶,问有多少种不同的方式爬到 n 阶。
def climb_stairs(n):
if n <= 2:
return n
dp = [0] * (n + 1)
dp[1], dp[2] = 1, 2
for i in range(3, n + 1):
dp[i] = dp[i - 1] + dp[i - 2]
return dp[n]
#刷题交流#
归并排序类问题,解题思路
分解:将数组分为两半。
解决:递归地对每个子数组进行归并排序。
合并:将两个已排序的子数组合并成一个大的已排序数组。
function mergeSort(array):
if length(array) <= 1:
return array
mid = length(array) / 2
left = mergeSort(array[0:mid])
right = mergeSort(array[mid:end])
return merge(left, right)
function merge(left, right):
result = []
while left and right are not empty:
if left[0] <= right[0]:
result.append(left[0])
left.remove(0)
else:
result.append(right[0])
right.remove(0)
return result + left + right
#刷题交流#
打卡:快速排序:分解:选取一个“基准”(pivot),将数组分为小于基准和大于基准的两部分。
解决:对这两部分递归地进行快速排序。
合并。
function quickSort(array):
if length(array) <= 1:
return array
pivot = array[length(array)/2]
left = [x for x in array if x < pivot]
middle = [x for x in array if x == pivot]
right = [x for x in array if x > pivot]
return quickSort(left) + middle + quickSort(right)
#刷题交流#
打卡11,计算第 n个斐波那契数的方法,递归法
def fibonacci_recursive(n):
if n <= 1:
return n
return fibonacci_recursive(n - 1) + fibonacci_recursive(n - 2)
#刷题交流#
打卡10堆排序的解题步骤:
构建最大堆:将无序数组构建成一个最大堆(Max Heap),这个堆的特性是每一个父节点的值都大于或等于其子节点的值。
交换元素:将最大堆的根节点(即最大值)与最后一个元素交换,此时最后一个元素已排好序。
调整堆:减少堆的大小(不包括已排序的元素),然后对根节点进行“堆化”操作,以重新构建最大堆。
重复:重复步骤2和3,直到所有元素都排好序。
#刷题交流#
打卡9:快速排序
分解:选取一个“基准”(pivot),将数组分为小于基准和大于基准的两部分。
解决:对这两部分递归地进行快速排序。
合并:因为排序是基于原地的,所以合并步骤是隐式的。
function quickSort(array):
if length(array) <= 1:
return array
pivot = array[length(array)/2]
left = [x for x in array if x < pivot]
middle = [x for x in array if x == pivot]
right = [x for x in array if x > pivot]
return quickSort(left) + middle + quickSort(right)
#刷题交流#
打卡8,分治法的案例:归并排序(Merge Sort)
分解:将数组分为两半。
解决:递归地对每个子数组进行归并排序。
合并:将两个已排序的子数组合并成一个大的已排序数组。
function mergeSort(array):
if length(array) <= 1:
return array
mid = length(array) / 2
left = mergeSort(array[0:mid])
right = mergeSort(array[mid:end])
return merge(left, right)
function merge(left, right):
result = []
while left and right are not empty:
if left[0] <= right[0]:
result.append(left[0])
left.remove(0)
else:
result.append(right[0])
right.remove(0)
return result + left + right
笑死,一天干11个小时,8:00到12:00,1:30到5:30,6:30到9:30。周末还加班,月底屁事多
#刷题交流#
今日打卡分享,分治法 (Divide and Conquer)
将复杂问题分解成更小的子问题,解决子问题,然后合并结果。
典型例子:归并排序、快速排序、二分查找。
#刷题交流#
打卡5
Python解题技巧,计算80百分位数的位置:position = round(len(nums) * 0.8) - 1,使用 round 函数而不是 int 函数来计算百分位数的位置是为了确保在计算位置时能够正确地处理小数部分。具体来说,round 函数会根据小数部分进行四舍五入,而 int 函数只是简单地截断小数部分。
#刷题交流#
打开第5天:RGB 色值转换
问题描::小M需要一个函数,用于将RGB颜色值转换为相应的十六进制整数值。RGB色值以字符串的形式给出,如"rgb(192, 192, 192)",需要转换为对应的整数值。
解题思路:RGB颜色由三个分量组成:红色(R)、绿色(G)和蓝色(B),每个分量的取值范围是0到255。
#刷题交流#
打卡第四天
分享深度优先搜索的使用场景:
路径查找:在迷宫或图中寻找路径。
连通性检查:判断图中的节点是否全部连通。
拓扑排序:在有向无环图中进行顶点排序。
图的遍历:列出图中的所有节点。
#刷题交流#
打卡第三天
深度优先搜索(Depth-First Search, DFS)是一种用于遍历或搜索树或图的算法。DFS 可以通过递归或者使用栈来实现。
def dfs(graph, node, visited):
if node not in visited:
print(node) # 处理节点
visited.add(node)
for neighbor in graph[node]:
dfs(graph, neighbor, visited)
# 示例图(使用字典表示邻接表)
graph = {
'A': ['B', 'C'],
'B': ['D', 'E'],
'C': ['F'],
'D': [],
'E': ['F'],
'F': []
}
visited = set()
dfs(graph, 'A', visited)
下一页