双指针,平衡二叉树与最小生成树

embedded/2024/12/22 1:49:25/

1:直方图的水量

题目链接:面试题 17.21. 直方图的水量 - 力扣(LeetCode)

双指针

  1. 初始化:我们使用两个指针 left 和 right 分别指向数组的开始和结束。同时,我们记录下这两个位置的高度,即 max_left 和 max_right

  2. 遍历数组:我们使用一个 while 循环来遍历整个数组,直到 left 和 right 相遇。在每次循环中,我们比较 left 和 right 位置的柱子高度。

  3. 处理较矮的柱子

    • 如果 left 位置的柱子高度小于 right 位置的柱子高度,我们检查 left 位置的柱子高度是否大于或等于 max_left。如果是,我们更新 max_left;如果不是,那么 left 位置的柱子与 max_left 之间的差距就是可以存储的水量。然后,我们将 left 指针向右移动一位。
    • 如果 right 位置的柱子高度小于或等于 left 位置的柱子高度,我们执行类似的操作,但针对 right 位置的柱子。
  4. 计算水量:在每次循环中,我们计算较矮柱子与它对应的最大高度之间的差距,并将这个差距累加到 water 变量中。

  5. 结束条件:当 left 和 right 相遇时,循环结束。

这个算法的关键在于,我们总是从两边向中间遍历,并确保在每次比较中,我们都有当前方向上的最大高度。这样,我们就可以确保在移动指针时正确地计算水量。因为我们是从两边向中间移动,所以每个位置只被访问一次,这使得算法的时间复杂度为 O(n)。

python">def trap(height):if not height:return 0left, right = 0, len(height) - 1max_left, max_right = height[left], height[right]water = 0while left < right:if height[left] < height[right]:if height[left] >= max_left:max_left = height[left]else:water += max_left - height[left]left += 1else:if height[right] >= max_right:max_right = height[right]else:water += max_right - height[right]right -= 1return watera = list(map(int, input().split()))
print(trap(a))

2:平衡二叉树

题目链接:LCR 176. 判断是否为平衡二叉树 - 力扣(LeetCode)

平衡二叉树的定义是:对于树中的任意一个节点,其左右子树的高度差不超过1。以下是一个判断二叉树是否为平衡二叉树的Python代码实现:

python">class TreeNode:def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = rightdef list_to_tree(lst):if not lst:return Noneroot = TreeNode(lst[0])queue = [root]i = 1while queue and i < len(lst):current = queue.pop(0)if i < len(lst) and lst[i] is not None:current.left = TreeNode(lst[i])queue.append(current.left)i += 1if i < len(lst) and lst[i] is not None:current.right = TreeNode(lst[i])queue.append(current.right)i += 1return rootdef isBalanced(root):def check_balance(node):if not node:return 0, Trueleft_height, left_balanced = check_balance(node.left)right_height, right_balanced = check_balance(node.right)balanced = left_balanced and right_balanced and abs(left_height - right_height) <= 1height = max(left_height, right_height) + 1return height, balanced_, is_tree_balanced = check_balance(root)return is_tree_balanced# 用户输入处理
user_input = input()
root = list_to_tree(input_tree)
print(isBalanced(root))

这段代码中的 list_to_tree 函数负责将列表转换为二叉树结构。它使用广度优先搜索(BFS)的方法来遍历列表,并构建相应的树节点。然后,isBalanced 函数会检查这个树是否是平衡的。

3:最小生成树(Prim算法

题目链接:1584. 连接所有点的最小费用 - 力扣(LeetCode)

这个问题可以通过使用Prim算法或者Kruskal算法来解决,这两种算法都是用来寻找最小生成树的经典算法。最小生成树是指在一个加权无向图中,包含图中全部顶点的、权值之和最小的树形结构。

对于这个问题,我们可以按以下步骤实现Prim算法

  1. 创建一个数组,用来记录每个点到最小生成树的最短距离。
  2. 初始化这个数组,将除了起点外的所有点的距离设置为无穷大。
  3. 创建一个最小堆(优先队列),将所有点按照到最小生成树的距离排序。
  4. 依次从堆中取出距离最小的点,并将其连接到最小生成树中,同时更新其他点到最小生成树的距离。

现在,我将用Python代码来实现这个算法

python">import heapqdef minCostConnectPoints(points):# 计算两个点之间的曼哈顿距离def manhattan_distance(p1, p2):return abs(p1[0] - p2[0]) + abs(p1[1] - p2[1])n = len(points)# 初始化最小生成树距离数组,全部设置为无穷大min_span_tree = [float('inf')] * n# 从第一个点开始构建最小生成树min_span_tree[0] = 0# 创建一个最小堆,存储(距离, 点的索引)heap = [(0, 0)]total_cost = 0visited = [False] * nwhile heap:# 从堆中取出距离最小的点cost, idx = heapq.heappop(heap)if visited[idx]:continue# 将这个点加入最小生成树visited[idx] = Truetotal_cost += cost# 更新其他点到最小生成树的距离for i in range(n):if not visited[i]:dist = manhattan_distance(points[idx], points[i])if dist < min_span_tree[i]:min_span_tree[i] = distheapq.heappush(heap, (dist, i))return total_cost


http://www.ppmy.cn/embedded/121764.html

相关文章

深度学习----------------------------编码器、解码器架构

目录 重新考察CNN重新考察RNN编码器-解码器架构总结编码器解码器架构编码器解码器合并编码器和解码器 重新考察CNN 编码器&#xff1a;将输入编码成中间表达形式&#xff08;特征&#xff09; 解码器&#xff1a;将中间表示解码成输出。 重新考察RNN 编码器&#xff1a;将文…

千益畅行,旅游创业新模式的创新与发展

旅游创业的时代背景与旅游卡的崛起&#xff0c;在当今快节奏的时代&#xff0c;旅行成为人们生活中的重要部分&#xff0c;随着科技发展和市场需求的变化&#xff0c;旅游创业项目中的旅游卡应运而生。 其中&#xff0c;“千益畅行” 旅游卡作为新兴力量&#xff0c;在共享经济…

在VS code 中部署C#和avalonia开发环境

要在 Mac 的 VS Code 中配置 C# 和 Avalonia 的开发环境&#xff0c;您可以按照以下步骤进行&#xff1a; 1. 安装 .NET SDK 下载 .NET SDK&#xff1a; 访问 .NET 下载页面。选择适用于 macOS 的最新稳定版本的 .NET SDK&#xff0c;并下载安装程序。安装 .NET SDK&#xff1…

Springboot+PostgreSQL+MybatisPlus存储JSON或List、数组(Array)数据

项目架构 SpringbootPostgreSQLMybatisPlus 从Mongodb转过来的项目&#xff0c;有存储json数据的需求&#xff0c;但是在mybatis-plus上会出点问题 报错&#xff1a; Error updating database. Cause: org.postgresql.util.PSQLException 字段 “” 的类型为 jsonb, 但表达式的…

Elasticsearch 开放推理 API 增加了对 Google AI Studio 的支持

作者&#xff1a;来自 Elastic Jeff Vestal 我们很高兴地宣布 Elasticsearch 的开放推理 API 支持 Gemini 开发者 API。使用 Google AI Studio 时&#xff0c;开发者现在可以与 Elasticsearch 索引中的数据进行聊天、运行实验并使用 Google Cloud 的模型&#xff08;例如 Gemin…

Prometheus之Pushgateway使用

Pushgateway属于整个架构图的这一部分 The Pushgateway is an intermediary service which allows you to push metrics from jobs which cannot be scraped. The Prometheus Pushgateway exists to allow ephemeral and batch jobs to expose their metrics to Prometheus. S…

Git大框架总结

下面首先是我对于git的一个小总结&#xff0c;主要是大框架 首先是四区&#xff0c;因为大部分你所有的工作都是在这四个区里的实现的&#xff0c;包括要提交一个东西&#xff0c;是先是在工作区修改&#xff0c;后用add添加到暂存区&#xff0c;后提交到本地仓库&#xff0c;当…

C语言基础之数组

上一篇讲述了C语言函数的使用&#xff0c;本文讲述数组的相关概念&#xff0c;通过一维数组、二维数组、数组越界等详细讲解数组相关的具体内容&#xff0c;以辅助读者了解并掌握数组相关概念。 一维数组 一维数组的定义与创建 若无数组&#xff0c;我们要存储一堆类型相同的…