![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
文章平均质量分 52
gongweixin2018
这个作者很懒,什么都没留下…
展开
-
每日算法--输入n个整数,找出其中最小的K个数(双端队列、栈辅助:空间复杂度较低)
/** * 输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。 * 维护一个双端队列按从小到大的顺序存放最小的K个数字 * 遍历原始数组, * 小于队列中的最小值,后端入队,大于于队列中的最大值,前端出队。队列长度大于k 剔除最大值 * 小于最大值且大于最小值,最大值出队,再维护队列顺序。 * 需要注意:k的判断;值相等的时候处理方式;k大于数组长度时直接给空(题意不明);k等于1时需要做特殊处理 * */publi.原创 2021-02-04 11:21:25 · 312 阅读 · 0 评论 -
每日算法--回文链表
/** * 给定一个链表,请判断该链表是否为回文结构。 * 思路: * 前半段压入栈,判断后半段是否相等 * 注意链表奇数与偶数,奇数中间节点跳过 */public class NC96 { public static boolean isPail (ListNode head) { //链表长度 if(head==null||head.next==null){ return false; } .原创 2021-01-29 21:57:58 · 61 阅读 · 0 评论 -
每日算法--链表重排
/** * 将给定的单链表L: L_0→L_1→…→L_{n-1}→L_n * 重新排序为:L_0→L_n →L_1→L_{n-1}→L_2→L_{n-2}→… * 要求使用原地算法,不能改变节点内部的值,需要对实际的节点进行交换。 * 例如: * 对于给定的单链表{10,20,30,40},将其重新排序为{10,40,20,30}. * * 核心思路: * 链表折半分为两段, * 后面一段反转 * 同时遍历两个链表交叉插入 * */public class NC50 { .原创 2021-01-28 22:21:18 · 199 阅读 · 0 评论 -
每日算法--链表反转
/** * 输入一个链表,反转链表后,输出新链表的表头。 * 思路:注意头尾节点的处理 */public class NC78 { public ListNode ReverseList(ListNode head) { if(head==null||head.next==null){ return head; } ListNode tail = head; ListNode current = .原创 2021-01-28 21:35:11 · 62 阅读 · 0 评论 -
每日算法--合并两个有序列表
/** * 将两个有序的链表合并为一个新链表,要求新的链表是通过拼接两个链表的节点来生成的,且合并后新链表依然有序。 * 思路: * l1为空返回l2,l2为空返回l2 * 都不为空,定义一个头节点,循环比较两个列表的大小,小的拼接到头结点,并拆除当前节点 * */public class NC33 { public ListNode mergeTwoLists (ListNode l1, ListNode l2) { if(l1==null){ .原创 2021-01-28 21:33:59 · 134 阅读 · 1 评论 -
复杂链表复制
/*** * 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点), * 返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空) * * 核心思路: * 复制链表中每一个节点,插入到被复制节点后面 * 维护复制节点的随机指针,该指针指向被复制节点随机指针指向的下一个节点 * 拆分复制节点和原来的节点 */public class ListCopy { public sta.原创 2021-01-27 23:10:12 · 60 阅读 · 0 评论 -
合并二叉树
/*** * 已知两颗二叉树,将它们合并成一颗二叉树。 * 合并规则是:都存在的结点,就将结点值加起来,否则空的位置就由另一个树的结点来代替。例如: * 两颗二叉树是: * Tree 1 * 1 * / \ * 3 2 * / * 5 * * Tree 2 * 2 * / \ * 1 3 * \ \ * 4 7 * * 合并后的树为 * 3 * / \ * 4 5 * /.原创 2021-01-24 01:43:07 · 141 阅读 · 0 评论 -
二叉树序列化反序列化(按层序列化)
import java.util.ArrayDeque;import java.util.Queue;/*** * 二叉树序列化反序列化(按层序列化) * #表示null节点,!表示节点分隔符 */public class BinaryTreeSerialByLevel { public static String serializ(TreeNode root){ if(root==null){ return ""; } .原创 2021-01-22 23:19:04 · 103 阅读 · 1 评论 -
二叉搜索树
/** * 二叉搜索树(算法导论) * 实现 遍历、查询、新增、删除、最大值查找、最小值查找、获取后继节点 */public class SearchBinaryTree { /** * 中序遍历所有节点 * 伪代码: * INORDER-TREE-WALK(x) * if(x != NIL) * INORDER-TREE-WALK(x.left) * print x.key * INO.原创 2021-01-21 23:28:19 · 58 阅读 · 0 评论 -
二叉树层遍历(双队列实现)
import java.util.ArrayDeque;import java.util.ArrayList;import java.util.Queue;import java.util.Stack;/** * 按层打印二叉树 * 给定一个二叉树,返回该二叉树层序遍历的结果,(从左到右,一层一层地遍历) * *核心思路1(两个栈实现): * 定义两个栈 * 将根节点放入第一个栈(标记为上层节点),last标记上层的最后一个节点 * 将第上层队列的子节点依次放入第二个栈(标记为下层.原创 2021-01-20 00:04:00 · 189 阅读 · 1 评论 -
二叉树遍历递归和非递归实现
import java.util.ArrayList;import java.util.Collections;import java.util.Stack;/** * 二叉树的前、中、后三种遍历方式递归实现和非递归实现 * 二叉树的序列化与反序列化 */public class PrintTree { //前序遍历递归 public static ArrayList<Integer> preRecursive(ArrayList<Integer>.原创 2021-01-20 20:59:01 · 56 阅读 · 0 评论