![](https://img-blog.csdnimg.cn/20190927151117521.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
java 算法题目解答
文章平均质量分 50
java 算法题目解答
FanJqi
这个作者很懒,什么都没留下…
展开
-
算法题目:删除链表的倒数第 N 个结点
19. 删除链表的倒数第 N 个结点难度中等1504收藏分享切换为英文接收动态反馈给你一个链表,删除链表的倒数第n个结点,并且返回链表的头结点。进阶:你能尝试使用一趟扫描实现吗?示例 1:输入:head = [1,2,3,4,5], n = 2输出:[1,2,3,5]示例 2:输入:head = [1], n = 1输出:[]示例 3:输入:head = [1,2], n = 1输出:[1]提示:链表中结点的数目为sz 1 <=...原创 2021-08-13 17:01:33 · 109 阅读 · 0 评论 -
算法题目:二叉树中第二小的节点
思路:使用深度优先遍历,比较每个节点的大小,最后得出结论。但是该题目可以减枝,由于题目的特性root.val = min(root.left.val, root.right.val),所以得出根节点是最小的节点,并且父节点第二小的节点的父节点一定等于根节点的值。通过以上两种特性来进行遍历和减枝操作。观察树结合该题目的条件,我们不难发现,图中的③④节点无论如何往下衍生,都只会是这两个节点最小,所以每次只需要比较父节点的值等于根节点的值的节点的值是否是第二小。代码如下:public c...原创 2021-07-27 20:52:19 · 115 阅读 · 0 评论 -
算法题目:二叉树的层平均值
思路:直接使用层级遍历,获取每层的总和,然后除以每层的节点数来获取层平均值,题目简单,不做详细说明了,如有问题请在下面提问。代码如下:class Solution { public List<Double> averageOfLevels(TreeNode root) { List<Double> res = new ArrayList<>(); if(root==null) { return ..原创 2020-09-12 12:56:49 · 121 阅读 · 0 评论 -
算法题目:组合总和 III
思路:使用回溯+减枝来获取组合,由于组合内不重复,并且为1-9的整数,解空间树的如下图所示:代码及代码说明如下:class Solution { public List<List<Integer>> combinationSum3(int k, int n) { List<List<Integer>> resList = new ArrayList<>(); //遍历解空间树 ..原创 2020-09-12 12:49:47 · 95 阅读 · 0 评论 -
算法题目:前 K 个高频元素
思路:先循环整个数组,将数组中的元素和元素出现的次数存hashmap的集合中,在循环集合,建立一个有优先队列PriorityQueue,优先队列的长度为k,当长度还未到达k的时候直接将数据放入优先队列中,优先队列长度为k时,比较优先队列顶部的元素大小,当元素大于队列顶部元素时,取出顶部元素并将当前元素放入队列中。优先队列(PriorityQueue):具体是通过完成二叉树实现,小顶堆保证每个节点的值都小于等于其两个子节点,顶部则是最小值,大顶堆则相反。本题使用的是大顶堆,需要重写比较器Compara..原创 2020-09-10 10:51:46 · 105 阅读 · 0 评论 -
算法题目:二叉树的层次遍历
难顶,断开连接半个月,公司项目太忙都没时间学习一下。吐槽一下思路:二叉树的广度优先搜索,将每一层的数据放入一个list中,然后在将每层数据list放入总的list集合中代码如下:/** * 使用二叉树层级遍历,每次将一层数据放入集合中,再将每层的集合插入list的首位 **/class Solution { public List<List<Integer>> levelOrderBottom(TreeNode root) { List..原创 2020-09-06 11:27:59 · 170 阅读 · 0 评论 -
算法题目:平衡二叉树
思路:本来,我看到这道题目的第一想法的遍历二叉树,然后计算每个节点的高度。我当时的想法就很简单,前序遍历并且计算,但是仔细一想这样会产生大量的重复计算,感觉题目这样子解不太好。当时看了一下题目的评论,看到了从底向上的计算方式,的确后序遍历只需要计算一次,比前序遍历更加简洁和快速。以下是我手画的后序遍历思路图:如下是代码及说明:public class Main { public static void main(String[]args){ Solution ..原创 2020-08-17 11:09:03 · 219 阅读 · 0 评论 -
算法题目:无重复字符的最长子串
思路:使用滑动窗口的方法:用两个指针来确定未重复子串,计算长度。出现重复后将开始指针指向重复字符,再次获取子串并计算长度,直到整个字符串循环完成,每次唯一都要计算长度并且与原最长长度比较,循环完成即可获取最长长度。初始开始下标为-1,在最前面,结束下面为0,在第一个字符,图解如下:具体代码及代码解释如下class Solution { public int lengthOfLongestSubstring(String s) { if(s == null || ..原创 2020-08-15 18:45:37 · 218 阅读 · 0 评论 -
算法题目:有效的括号
思路:循环遍历整个字符串,将遍历到的括号开始符对应的结束符存储在栈中,然后遍历到结束符的时候与栈顶的元素相比较,如果正确则取出栈顶元素,直到循环完成,栈为空则为有效字符串。如果循环中有一次比较为false则该字符串不是有效字符串代码如下://使用栈来储存与括号开始字符相对应的结束字符 然后对比class Solution { public boolean isValid(String s) { //栈先进后出,用于比较括号 Stack<Chara..原创 2020-08-14 14:24:39 · 154 阅读 · 0 评论 -
算法题目:克隆图
思路:首先,需要一个hash表来保存已经遍历过的节点,防止节点的重复读取形成死循环。然后使用深度遍历,递归遍历所有的节点并且深拷贝后返回节点,深拷贝的话直接new一个node即可以下是代码//深拷贝 深度优先算法class Solution { //记录是否重复的hash表 public Map<String, Node> readMap = new HashMap<>(); public Node cloneGraph(Node nod...原创 2020-08-12 10:39:59 · 120 阅读 · 0 评论 -
算法题目:被围绕的区域
题目:思路:首先 将不需要替换的O 替换为另一个字符*,然后将需要替换的字符替换为X,再将字符*替换会O,由于行数或者列数少于两行的时候 ,字符一定是在边界上,所以直接返回不需要计算替换方法:使用深度优先算法 递归将不需要替换的字符替换为*号。class Solution { public void solve(char[][] board) { // 首先判断行和列 行和列少于2 直接return if(board==null || boar..原创 2020-08-11 16:52:36 · 341 阅读 · 0 评论