【优选算法】(第三十七篇)

news/2024/10/17 18:48:06/

目录

在每个树⾏中找最⼤值(medium)

题目解析

讲解算法原理

编写代码

最后⼀块⽯头的重量(easy)

题目解析

讲解算法原理

编写代码


在每个树⾏中找最⼤值(medium)

题目解析

1.题目链接:. - 力扣(LeetCode)

2.题目描述

给定⼀棵⼆叉树的根节点root,请找出该⼆叉树中每⼀层的最⼤值。
⽰例1:

输⼊:root=[1,3,2,5,3,null,9]
输出:[1,3,9]
⽰例2:
输⼊:root=[1,2,3]
输出:[1,3]

讲解算法原理

解法(bfs):
算法思路:

层序遍历过程中,在执⾏让下⼀层节点⼊队的时候,我们是可以在循环中统计出当前层结点的最⼤值的。
因此,可以在bfs的过程中,统计出每⼀层结点的最⼤值。

编写代码

c++算法代码:

/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), 
right(right) {}* };*/
class Solution
{
public:vector<int> largestValues(TreeNode* root) {vector<int> ret;if(root == nullptr) return ret;queue<TreeNode*> q;q.push(root);while(q.size()){int sz = q.size();int tmp = INT_MIN;for(int i = 0; i < sz; i++){auto t = q.front();q.pop();tmp = max(tmp, t->val);if(t->left) q.push(t->left);if(t->right) q.push(t->right);}ret.push_back(tmp);}return ret;}
};

java算法代码:

/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val = val; }* TreeNode(int val, TreeNode left, TreeNode right) {* this.val = val;* this.left = left;* this.right = right;* }* }*/
class Solution
{public List<Integer> largestValues(TreeNode root) {List<Integer> ret = new ArrayList<>();if(root == null) return ret;Queue<TreeNode> q = new LinkedList<>();q.add(root);while(!q.isEmpty()){int sz = q.size();int tmp = Integer.MIN_VALUE;for(int i = 0; i < sz; i++){TreeNode t = q.poll();tmp = Math.max(tmp, t.val);if(t.left != null) q.add(t.left);if(t.right != null) q.add(t.right);}ret.add(tmp);}return ret;}
}

最后⼀块⽯头的重量(easy)

题目解析

1.题目链接:. - 力扣(LeetCode)

2.题目描述

有⼀堆⽯头,每块⽯头的重量都是正整数。每⼀回合,从中选出两块最重的⽯头,然后将它们⼀起粉碎。假设⽯头的重量分别为x和y,且x
<=y。那么粉碎的可能结果如下:• 如果x==y,那么两块⽯头都会被完全粉碎;• 如果x!=y,那么重量为x的⽯头将会完全粉碎,⽽重量为y的⽯头新重量为y-x。最后,最多只会剩下⼀块⽯头。返回此⽯头的重量。如果没有⽯头剩下,就返回0。
⽰例:输⼊:[2,7,4,1,8,1]输出:1
解释:
先选出7和8,得到1,所以数组转换为[2,4,1,1,1],再选出2和4,得到2,所以数组转换为[2,1,1,1],接着是2和1,得到1,所以数组转换为[1,1,1],
最后选出1和1,得到0,最终数组转换为[1],这就是最后剩下那块⽯头的重量。
提⽰:
1<=stones.length<=30
1<=stones[i]<=1000

讲解算法原理

解法(利⽤堆):算法思路:
其实就是⼀个模拟的过程:• 每次从⽯堆中拿出最⼤的元素以及次⼤的元素,然后将它们粉碎;• 如果还有剩余,就将剩余的⽯头继续放在原始的⽯堆⾥⾯
重复上⾯的操作,直到⽯堆⾥⾯只剩下⼀个元素,或者没有元素(因为所有的⽯头可能全部抵消了)
那么主要的问题就是解决:
• 如何顺利的拿出最⼤的⽯头以及次⼤的⽯头;
• 并且将粉碎后的⽯头放⼊⽯堆中之后,也能快速找到下⼀轮粉碎的最⼤⽯头和次⼤⽯头;
这不正好可以利⽤堆的特性来实现嘛?
• 我们可以创建⼀个⼤根堆;
• 然后将所有的⽯头放⼊⼤根堆中;
• 每次拿出前两个堆顶元素粉碎⼀下,如果还有剩余,就将剩余的⽯头继续放⼊堆中;这样就能快速的模拟出这个过程。

编写代码

c++算法代码:

class Solution
{
public:int lastStoneWeight(vector<int>& stones) {// 1. 创建⼀个⼤根堆priority_queue<int> heap;// 2. 将所有元素丢进这个堆⾥⾯for(auto x : stones) heap.push(x);// 3. 模拟这个过程while(heap.size() > 1){int a = heap.top(); heap.pop();int b = heap.top(); heap.pop();if(a > b) heap.push(a - b);}return heap.size() ? heap.top() : 0;}
};

java算法代码:

class Solution
{public int lastStoneWeight(int[] stones) {// 1. 创建⼀个⼤根堆PriorityQueue<Integer> heap = new PriorityQueue<>((a, b) -> b - a);// 2. 把所有的⽯头放进堆⾥⾯for(int x : stones){heap.offer(x);}// 3. 模拟while(heap.size() > 1){int a = heap.poll();int b = heap.poll();if(a > b){heap.offer(a - b);}}return heap.isEmpty() ? 0 : heap.peek();}
}


http://www.ppmy.cn/news/1539776.html

相关文章

leetcode 刷题day44动态规划Part13( 647. 回文子串、516.最长回文子序列)

647. 回文子串 动规五部曲&#xff1a; 1、确定dp数组&#xff08;dp table&#xff09;以及下标的含义 按照之前做题的惯性&#xff0c;定义dp数组的时候很自然就会想题目求什么&#xff0c;就如何定义dp数组。但是对于本题来说&#xff0c;这样定义很难得到递推关系&#x…

【原创】java+springboot+mysql智能农村管理系统设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…

利用sessionStorage收集用户访问信息,然后传递给后端

这里只是简单的收集用户的停留时间、页面加载时间、当前页面URL及来源页面&#xff0c;以做示例 <html><head><meta http-equiv"content-type" content"text/html; charsetUTF-8"/><title>测试sessionStorage存储用户访问信息<…

面试经典150题刷题记录

数组部分 1. 合并两个有序的子数组 —— 倒序双指针避免覆盖 88. 合并两个有序数组 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&#xff0c;使…

高级算法设计与分析 学习笔记14 FFT

​ 本章我们研究多项式乘法。 我们直接乘&#xff0c;时间复杂度是n^2。使用FFT则可以变成nlgn ​编辑 可以看到两个n的多项式&#xff0c;我们直接乘&#xff0c;每种组合都要试一遍&#xff0c;就会要是n^2遍 ​编辑 那么要怎么加速呢&#xff1f; ​编辑 首先多项式可…

数据结构——八大排序(下)

数据结构中的八大排序算法是计算机科学领域经典的排序方法&#xff0c;它们各自具有不同的特点和适用场景。以下是这八大排序算法的详细介绍&#xff1a; 五、选择排序&#xff08;Selection Sort&#xff09; 核心思想&#xff1a;每一轮从未排序的元素中选择最小&#xff0…

SparkSQL介绍及使用

文章目录 1. SparkSQL介绍及使用1.1 SparkSQL介绍1.2 数据结构的形式1.3 Spark SQL 特点1.4 Spark SQL 和 Hive SQL关系 1. SparkSQL介绍及使用 1.1 SparkSQL介绍 Spark SQL是Apache Spark 用于处理结构化数据&#xff08;DataFrame和Datasets&#xff09;的模块。 在Spark1.0…

二叉树最小深度(递归)

111. 二叉树的最小深度 - 力扣&#xff08;LeetCode&#xff09; 给定一个二叉树&#xff0c;找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明&#xff1a;叶子节点是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [3,…