
获得徽章 8
赞了这篇沸点
#刷题交流#
处理连续两次操作的奇偶性限制。可以通过在动态规划的状态中引入一个维度来表示当前操作的奇偶性,从而确保连续两次操作的奇偶性不同。
定义状态:
使用一个二维DP数组dp[i][j],其中i表示当前处理到字符串的第i个字符,j表示当前操作的奇偶性(0表示偶数次操作,1表示奇数次操作)。
dp[i][j]表示在前i个字符中,最后一次操作的奇偶性为j时,可以获得的最大Cion币数。
状态转移:
对于每个字符,需要考虑以下几种情况:
替换操作:如果当前字符和前一个字符相同,我们可以进行替换操作。替换操作的奇偶性需要与上一次操作的奇偶性不同。
删除操作:可以删除当前字符,删除操作的奇偶性也需要与上一次操作的奇偶性不同。
初始化:
初始状态可以设为dp[0][0] = 0和dp[0][1] = -inf,表示在处理第一个字符之前,不进行任何操作。
最终结果:
最终结果为max(dp[n][0], dp[n][1]),其中n是字符串的长度。
处理连续两次操作的奇偶性限制。可以通过在动态规划的状态中引入一个维度来表示当前操作的奇偶性,从而确保连续两次操作的奇偶性不同。
定义状态:
使用一个二维DP数组dp[i][j],其中i表示当前处理到字符串的第i个字符,j表示当前操作的奇偶性(0表示偶数次操作,1表示奇数次操作)。
dp[i][j]表示在前i个字符中,最后一次操作的奇偶性为j时,可以获得的最大Cion币数。
状态转移:
对于每个字符,需要考虑以下几种情况:
替换操作:如果当前字符和前一个字符相同,我们可以进行替换操作。替换操作的奇偶性需要与上一次操作的奇偶性不同。
删除操作:可以删除当前字符,删除操作的奇偶性也需要与上一次操作的奇偶性不同。
初始化:
初始状态可以设为dp[0][0] = 0和dp[0][1] = -inf,表示在处理第一个字符之前,不进行任何操作。
最终结果:
最终结果为max(dp[n][0], dp[n][1]),其中n是字符串的长度。
展开
评论
1
#刷题交流#
补卡: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)
补卡: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。
打卡,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" 是最长无重复子串)
查找最长无重复子串的问题的解题思路:
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" 是最长无重复子串)
展开
评论
点赞
#刷题交流#
归并排序类问题,解题思路
分解:将数组分为两半。
解决:递归地对每个子数组进行归并排序。
合并:将两个已排序的子数组合并成一个大的已排序数组。
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
归并排序类问题,解题思路
分解:将数组分为两半。
解决:递归地对每个子数组进行归并排序。
合并:将两个已排序的子数组合并成一个大的已排序数组。
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)
打卡:快速排序:分解:选取一个“基准”(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)
展开
评论
1